var、let、const
阿新 • • 發佈:2017-11-17
not 復合 三次 循環語句 聲明 添加 syn color 並不是
//let是塊級作用域,函數內部使用let定義後,對函數外部無影響,例如: { let a = 1; var b = 2; } console.log(b)// 2 console.log(a)//ReferenceError: a is not defined let :{}可以構成作用域,稱之為塊級作用域 var:只有函數才可以構成作用域 —————— for (let i = 0; i < 3; i++) { let i = ‘abc‘; console.log(i); }//for循環的一個特別之處,就是循環語句部分是一個父作用域,而循環體內部 是一個單獨的子作用域,所以上面代碼會輸出三次‘abc‘,因為函數內部的變量i和函數外部的變量i是分離的
//const定義的變量不可以修改(這句話其實是十分不準確的,看了阮一峰老師的博客中ES6的文檔,恍然大悟),而且必須初始化,例如: const a = 1; console.log(a)// 輸出 1 —————————— const a ; console.log(a)//SyntaxError: Missing initializer in const declaration—————————— const a =1 ; a = 2 console.log(a)//TypeError: Assignment to constant variable.
//為什麽說const定義的變量不可以修改這句話不準確呢,上代碼:
const obj = {
name :‘aaa‘
}
obj.name = ‘bbbb‘
console.log(obj.name)//輸出‘bbbb‘
obj = {name:‘ccc‘}
console.log(obj.name)//TypeError: Assignment to constant variable.//在對象中添加屬性是在堆中給該對象添加數據,而沒有改變obj中存放的指向該對象的地址,而對obj重新賦值的操作則改變了obj的指針指向。
阮一峰老師的ES6文檔中寫到:
const實際上保證的,並不是變量的值不得改動,而是變量指向的那個內存地址不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同於常量。但對於復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至於它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
var、let、const