let,const

let const

let

  • 與var的區(qū)別
    • 塊級(jí)作用域
    • 不存在變量提升(會(huì)導(dǎo)致暫時(shí)性死區(qū))
    • 不允許重復(fù)聲明

1.塊級(jí)作用域

  • es5是函數(shù)作用域var變量會(huì)導(dǎo)致塊級(jí)作用域外泄:
// 塊級(jí)作用域外泄
var a = {test: '123', test1: '345'};
for (var item in a) {
    console.log(item);
}
console.log(item);//可以讀出item
  • es6中l(wèi)et關(guān)鍵字解決塊級(jí)作用域外泄
// 解決方法ES6中的let關(guān)鍵字
var a = {test: '123', test1: '345'};
for (let item in a) {
    console.log(item);
}
console.log(item);//塊級(jí)作用域外不可以讀出item

// 事實(shí)上babel會(huì)將上面語(yǔ)句轉(zhuǎn)換為:
var a = {test: '123', test1: '345'};
for (var _item in a) {
    console.log(_item);
}
console.log(item);

2.不存在變量提升

  • es5中的變量提升
console.log(foo); // 輸出undefined
var foo = 2;
// 相當(dāng)于
var foo;
console.log(foo); // 輸出undefined
foo = 2;
  • es6中l(wèi)et不存在變量提升
console.log(bar); // 報(bào)錯(cuò)ReferenceError
let bar = 2;
  • 塊級(jí)作用域和變量不提升導(dǎo)致的暫時(shí)性死區(qū)
//塊級(jí)作用域與let變量聲明之間的這一塊就是暫時(shí)性死區(qū)
var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

3.不允許重復(fù)聲明

  • es5中同一作用域下聲明兩個(gè)一樣的變量會(huì)后者覆蓋
var item = 1;
var item = 2;
console.log(item);//2
  • let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量。
// 報(bào)錯(cuò)
var item = 1;
let item = 2;
console.log(item);

const

  • const聲明一個(gè)只讀的常量。一旦聲明,常量的值就不能改變。

    • const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。
    • const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū)
    • const聲明的常量,也與let一樣不可重復(fù)聲明。
  • const的本質(zhì)

    • const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)。
    const foo = {}; 
    // 為 foo 添加一個(gè)屬性,可以成功
    foo.prop = 123;
    foo.prop // 123
    // 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò)
    foo = {}; // TypeError: "foo" is read-only
    

let和const變量的聲明不在是在全局變量上

var a = 1;
// 如果在 Node 的 REPL 環(huán)境,可以寫成 global.a
// 或者采用通用方法,寫成 this.a
window.a // 1

let b = 1;
window.b // undefined
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容