es6學習筆記(二)
阿新 • • 發佈:2018-12-12
es6學習筆記(二)
let 和 const 命令
let特性總結
- let宣告的變數只在其所在的塊級作用域內有效,大括號即為 一個作用域
//for迴圈還有一個特別之處,就是設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
- let宣告的變數不存在變數提升,變數必須在使用前宣告否則會報錯
- 暫時性死區:在一個塊中只要用let或者const有宣告該變數,都不能在宣告前使用該變數,否則會報錯,即使全域性中存在該變數
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
- let不允許在相同作用域內,重複宣告同一個變數。不能在函式內部重新宣告引數。
const特性總結
- const宣告一個只讀的常量。一旦宣告,常量的值就不能改變,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
- 只在宣告所在的塊級作用域內有效。
- const命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用
- const宣告的常量,也與let一樣不可重複宣告。
- 本質:const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所儲存的資料不得改動。
const foo = {}; // 為 foo 新增一個屬性,可以成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另一個物件,就會報錯 foo = {}; // TypeError: "foo" is read-only
解構賦值
- 陣列解構賦值
//第一個程式碼塊 { let a,b,rest; [a,b]=[1,2]; console.log(a,b); //1,2 } //第二個程式碼塊 { let a,b,rest; [a,b,...rest]=[1,2,3,4,5,6]; console.log(a,b,rest); //1,2,[2,3,4,5,6] } //預設值 { let a,b,c,rest; [a,b,c=3]=[1,2]; console.log(a,b,c); //1,2,3 } //交換值 { let a=1; let b=2; [a,b]=[b,a]; console.log(a,b); //2,1 } //函式結果 { function f(){ return [1,2]; } let a,b; [a,b]=f(); console.log(a,b) //1,2 } //獲取只能的資料 { function f(){ return [1,2,3,4,5] } let a,b,c; [a,,,b]=f(); console.log(a,b) //1,4 } //函式返回的陣列不確定 { function f(){ return [1,2,3,4,5] } let a,b,c; [a,...b]=f(); console.log(a,b) //1,[2,3,4,5] }
- 物件解構賦值
{ let a,b; ({a,b}={a:1,b:2}); console.log(a,b); //1,2 } //第二個程式碼塊 { let a,b,rest; [a,b,...rest]=[1,2,3,4,5,6]; console.log(a,b,rest); //1,2,[2,3,4,5,6] } //物件賦值 { let o={p:42,q:true}; let {p,q}=o; console.log(p,q); //42,true } //預設值 { let {a=10,b=5}={a:3}; console.log(a,b); } //json賦值 { let metaData={ title:'abc', test:[{ title:'test', desc:'description' }] } let {title:firstTitle,test:[{title:secondTest}]}=metaData; console.log(firstTitle,secondTest); }