var、let 和 const 都是 JavaScript 中用來聲明變量的關(guān)鍵字棒厘,并且 let 和 const 關(guān)鍵字是在 ES6 中才新增的奢人。
1达传、var 與 let 的區(qū)別
(1)作用域
var 聲明的變量的作用域只能是全局或者整個函數(shù)塊的。
let 聲明的變量的作用域則是它當(dāng)前所處代碼塊宪赶,即它的作用域既可以是全局或者整個函數(shù)塊搂妻,也可以是 if欲主、while、switch等用{}
限定的代碼塊扁瓢。
另外引几,var 和 let 的作用域規(guī)則都是一樣的伟桅,其聲明的變量只在其聲明的塊或子塊中可用。
function varTest() {
var a = 1;
{
var a = 2; // 函數(shù)塊中玖雁,同一個變量
console.log(a); // 2
}
console.log(a); // 2
}
function letTest() {
let a = 1;
{
let a = 2; // 代碼塊中,新的變量
console.log(a); // 2
}
console.log(a); // 1
}
varTest();
letTest();
let 聲明的變量的作用域可以比 var 聲明的變量的作用域有更小的限定范圍赫冬,更具靈活劲厌。
(2)重復(fù)聲明
var 允許在同一作用域中重復(fù)聲明哭廉,而 let 不允許在同一作用域中重復(fù)聲明遵绰,否則將拋出異常增淹。
var a = 1;
var a = 2;
console.log(a) // 2
let a = 1;
let a = 2; // SyntaxError: Identifier 'a' has already been declared
switch(index) {
case 0:
let a = 1;
break;
default:
let a = 2; // SyntaxError: Identifier 'a' has already been declared
break;
}
let 聲明的重復(fù)性檢查是在代碼正式開始執(zhí)行之前就會進(jìn)行檢查。
(3)綁定全局對象
var 在全局環(huán)境聲明變量成玫,會在全局對象里新建一個屬性哭当,而 let 在全局環(huán)境聲明變量冗澈,則不會在全局對象里新建一個屬性亚亲。
var foo = 'global'
let bar = 'global'
console.log(this.foo) // global
console.log(this.bar) // undefined
let 在全局環(huán)境聲明變量 bar 保存在[[Scopes]][0]: Script
這個變量對象的屬性中,而[[Scopes]][1]: Global
就是我們常說的全局對象肛响。
(4)變量提升與暫存死區(qū)
4.1 var的變量提升
console.log(a) // undefined
var a = 1;
console.log(a) // 1
//////////////////////////相當(dāng)于以下代碼
var a;//先聲明變量
console.log(a);
a = 1;//再給變量賦值
console.log(a);
4.2 let的暫存死區(qū)
let 在變量初始化前訪問該變量會導(dǎo)致 ReferenceError
特笋,因此從進(jìn)入作用域創(chuàng)建變量雹有, 到變量開始可被訪問的一段時間(過程),就稱為暫存死區(qū)(Temporal Dead Zone)溜宽。
console.log(bar); // undefined
console.log(foo); // ReferenceError: foo is not defined
var bar = 1;
let foo = 2;
var foo = 33;
{
let foo = (foo + 55); // ReferenceError: foo is not defined
}
總結(jié):var再創(chuàng)建變量時會將變量初始化為undefined适揉,而let不會被初始化。
3.let 與 const 異同
const 與 let 很類似嫉嘀,都具有上面提到的 let 的特性剪侮,唯一區(qū)別就在于 const 聲明的是一個只讀變量洛退,聲明之后不允許改變其值瓣俯。因此,const 一旦聲明必須初始化兵怯,否則會報錯彩匕。
let a;
const b = "constant";
a = "variable";
b = 'change'; // TypeError: Assignment to constant variable
其實(shí) const 其實(shí)保證的不是變量的值不變,而是保證變量指向的內(nèi)存地址所保存的數(shù)據(jù)不允許改動(即棧內(nèi)存在的值和地址)媒区。