var / let / const
阿新 • • 發佈:2017-07-14
com function logs lan 指向 如果 復合 發生 類型
1、var在聲明所在的函數作用域內有效。 function(){}
let與const都是只在聲明所在的塊級作用域內有效。{}
2、var與let聲明的變量可以改變,值和類型都可以改變,沒有限制。
const
聲明的常量不得改變值,這意味著,const一旦聲明常量,就必須立即初始化,不能留到以後賦值,且不能重復賦值。
const a; // 報錯,一旦聲明變量,應該立即賦值!! const b = 10; b = 20; // 報錯,因為定義常量之後不能重新賦值!!
3、對於復合類型的變量,如數組和對象,變量名不指向數據,而是指向數據所在的地址。
const
命令只是保證變量名指向的地址不變,並不保證該地址的數據不變。
const arr = []; arr = [1, 2, 3]; // 報錯,因為變量arr指向的地址不能發生改變,應始終指向[]所在的地址!!![1,2,3]與[]不是同一個地址
下面這樣就不會報錯:
arr[0] = 1; arr[1] = 2; arr[2] = 3;
對象也是如此,示例如下:
const obj = { a: 1, b: 2 };
obj = { // 報錯 a: 3, b: 4 };
obj.a = 3; // 不報錯 obj.b = 4; // 不報錯
如果想讓定義的對象或數組的內部數據也不能夠修改和改變,可以使用Object.freeze(obj)進行凍結,這樣為對象添加新屬性就不起作用。
除了將對象本身凍結,對象的屬性也應該凍結。
const obj = { a: 1, b: 2 }; obj.a = 9; console.log(obj); // {a: 9, b: 2}; obj.a 發生改變 Object.freeze(obj); // 凍結 obj.b = 99; console.log(obj); // {a: 9, b: 2}; obj.b 未發生改變
參考:let和const命令
var / let / const