JS變量聲明--var, let, const 的區別

ES6之前,我們都是使用 var 來聲明一個變量。在ES6中,又新增加了 letconst 關鍵字用來聲明變量。那麼它們之間有何不同呢?
下面本文將一一說明:


let

let的用法與var十分相似,只是在功能上有以下幾點不同:

  1. let 聲明的變量只在定義的代碼塊內有效。比如下面代碼中輸出b就會報錯!
{
	var a = 1;
	let b = 2;
}
console.log(a) // 1
console.log(b) // Uncaught ReferenceError: b is not defined
  1. let 聲明的變量不會出現變量提升,即必須先聲明再使用。比如下面代碼中執行方法a()會報錯!
function a () {
	console.log(b);
	let b = 2;
}
a(); // Uncaught ReferenceError: Cannot access 'b' before initialization
  1. 使用let聲明會使塊級作用域變爲暫時性死區,即該代碼塊會與聲明的變量綁定,不再首外部影響。這個理解起來有點難,我們看下面代碼:
var b = 2;
function a () {
	console.log(b);
	let b = 3;
}
a(); // Uncaught ReferenceError: Cannot access 'b' before initialization

可以看到,執行方法a()仍然報錯,這就是因爲a()內部使用let定義b,使得a()內部不受外面使用var定義的b影響。所以出現了與第2條相同的報錯!

  1. 使用let聲明的變量不允許在作用域內重複聲明。這條就比較好理解來,看下面代碼吧!
function a() {
	let b = 2;
	let b = 3;
}
a(); // Uncaught SyntaxError: Identifier 'b' has already been declared

const

const是對let的增強,它能阻止對一個變量再次賦值。簡單來說就是const相當於用let聲明瞭一個只讀的變量。使用const時除了上面關於let的注意事項外,還要注意以下幾點:

  1. const聲明的變量必須在聲明時立即賦值,不可留待以後。且聲明後值不可更改。比如下面代碼就會報錯:
const a = 1;
console.log(a); // 1
a = 2; // Uncaught TypeError: Assignment to constant variable.
const b; // Uncaught SyntaxError: Missing initializer in const declaration
  1. const本質上保護的是變量只想的內存地址中保存的數據不可改動,這對於簡單類型的數據而言,內存中保存的就是值本身。但是對於複合類型數據(對象和數組)來說,內存中保存的只是指向實際數據位置的指針,const只能保護這個指針不變。比如下面代碼:
const a = {
	'b': 1
}
console.log(a); // {b:1}
a.b = 2; // 不會報錯
console.log(a); // {b:2}
a = {}; // Uncaught TypeError: Assignment to constant variable.

可以看到,只有在試圖將一個空對象賦值給a時纔會報錯。因此將一個對象或數組賦值給const變量必須非常謹慎!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章