var a = [1, 2, 3]
var b = a // 該操做後,b直接指向數組對象,不是b指向a,a再指向數組。
a = [3, 4, 5]
複製代碼
Q:請問b的值是多少? 【b = [1, 2, 3]】程序員
大多數人會這麼想,因爲數組是引用類型,所以認爲答案是[3, 4, 5] ,其實咱們能夠把數組[3, 4, 5]看作是數組c,那麼當a=c其實a已經再也不指向原來的數組對象了 json
var a = [1, 2, 3]
var b = a
a.pop()
複製代碼
Q:請問b的值是多少? 【b = [1, 2]】數組
首先咱們先來回顧一下js數據類型:
值類型:數字、字符串、布爾、undefined、null
引用類型:數組、對象、函數bash
引用類型和值類型的區別:異步
var a = 1
var b = {};
var c = [];
a.name = 'mm';
b.name = 'Adela';
a.name // undefined
b.name // "Adela"
typeof(a) // "number"
typeof(b) // "object"
typeof(c) // "object"
b instanceof Object // true
c instanceof Array // true
複製代碼
深拷貝方法:
① 數組: slice、concat、ES6擴展運算符實現數組的深拷貝async
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.slice(0)
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
複製代碼
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
複製代碼
var arr1 = [1, 2, 3, 4]
var [...arr2] = arr1
arr2.pop() // 4
arr1 // [1, 2, 3, 4]
arr2 // [1, 2, 3]
複製代碼
② 對象:JSON.parse(JSON.stringify(obj1)、ES6擴展運算符實現數組的深拷貝
JSON.parse(str)
: parse用於從一個字符串中解析出json對象
JSON.stringify(obj)
:stringify()用於從一個對象解析出字符串函數
var obj1 = {
name: 'Adela',
age: '18',
}
var obj2 = JSON.parse(JSON.stringify(obj1))
obj1.name = 'mm'
obj1 // {name: "mm", age: "18"}
obj2 // {name: "Adela", age: "18"}
複製代碼
var obj1 = {
name: 'Adela',
age: '18',
}
var {...obj2} = obj1
obj1.name = 'mm'
obj1 // {name: "mm", age: "18"}
obj2 // {name: "Adela", age: "18"}
複製代碼
做用域
:是指你代碼的上下文環境,js做用域包括全局做用域
、函數做用域
、塊做用域(ps:這是ES6新增的)
ui
async
是異步
的簡寫,而await
能夠認爲是async wait
的簡寫。
async 用於申明一個 function 是異步的,而 await 用於等待一個異步方法執行完成。spa
sync 會將其後的函數(函數表達式或 Lambda)的返回值封裝成一個Promise
對象,而 await 會等待這個 Promise 完成,並將其resolve
的結果返回出來。3d
優點
在於處理 then 鏈// 假設一個業務,分多個步驟完成,每一個步驟都是異步的,並且依賴於上一個步驟的結果
async function doIt() {
console.time("doIt");
const time1 = 300;
const time2 = await step1(time1);
const time3 = await step2(time2);
const result = await step3(time3);
console.log(`result is ${result}`);
console.timeEnd("doIt");
}
doIt();
複製代碼
當 async 函數中只要一個 await 出現 reject
狀態,則後面的 await 都不會被執行。解決辦法
:能夠添加 try/catch
let a;
async function correct() {
try {
await Promise.reject('error')
} catch (error) {
console.log(error)
}
a = await 1
return a
}
複製代碼
術語
1.語法糖(Syntactic Sugar),也稱糖衣語法,指在計算機語言中添加的某種語法,這種語法對語言自己功能來講沒有什麼影響,只是爲了方便程序員的開發,提升開發效率。說白了,語法糖就是對現有語法的一個封裝。