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

var / let / const

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