for循環中,設置循環變量的那部分是一個副作用域,而循環體內部是一個單獨的子作用域。
暫時性死區:代碼塊內,使用let聲明變量之前,對該變量的操作都會拋出ReferenceError異常。
let & const的一個重要性是其不出現變量提升。
如果塊區中存在let和const命令,則這個塊區對這些命令聲明的變量從一開始就形成封閉作用域,只要在聲明前使用,就會報錯。
注意:影響typeof安全性。const大致和let相似,但其實際上保證的是變量指向的那個內存地址不得改動。
注意:使用freeze可以凍結對象及其屬性。
const foo = Object.freeze ({ });
ES6中:let, const, class命令聲明的全局變量不屬于頂層對象window的屬性。
解構賦值:
原則:只要等號右邊的值不是對象或數組,就會先將其轉為對象,undefined和null無法轉為對象,所以解構賦值會失敗。
- 解構不成功,變量的值就等于undefined。
let foo = [ ];
let [bar, foo] = [1];
- 不完全解構,也是可以成功。
- 等號右邊的值不具備Iterator接口就會報錯。只要某種數據結構具有Iterator接口,都可以采用數組形式的解構賦值。
- 解構賦值允許默認值。ES6內部用“===”判斷一個位置是否有值,數組成員不嚴格等于undefined,默認值不生效(即可以賦值null)。
- 對象的解構
- 對象解構賦值的屬性沒有次序,但變量必須與屬性同名。
- 內部機制:先找到同名屬性,再賦值給對應的變量。真正被賦值的是后者。
- 解構失敗,值為undefined。
- 圓括號與解構賦值的關系
- 解構賦值允許等號左邊的模式之中不放置任何變量名。
- 解構賦值提取JSON對象數據很有用。