1. 程式人生 > >var、let、const

var、let、const

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