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ì)將上面語句轉(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