基本都是從阮一峰大神的文檔中摘錄的重點(diǎn)具练,
鏈接:http://es6.ruanyifeng.com/?search=%E7%AE%AD%E5%A4%B4&x=0&y=0
一、let命令
1甜无、基本用法
用來(lái)聲明變量扛点,用法類似于var,但是所聲明的變量岂丘,只在let命令所在的代碼塊內(nèi)有效陵究。
下面的代碼如果使用var,最后輸出的是10奥帘。
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
上面代碼中铜邮,變量i是var命令聲明的,在全局范圍內(nèi)都有效寨蹋,所以全局只有一個(gè)變量i松蒜。每一次循環(huán),變量i的值都會(huì)發(fā)生改變已旧,而循環(huán)內(nèi)被賦給數(shù)組a的函數(shù)內(nèi)部的console.log(i)秸苗,里面的i指向的就是全局的i。也就是說(shuō)运褪,所有數(shù)組a的成員里面的i难述,指向的都是同一個(gè)i萤晴,導(dǎo)致運(yùn)行時(shí)輸出的是最后一輪的i的值,也就是10胁后。
如果使用let店读,聲明的變量?jī)H在塊級(jí)作用域內(nèi)有效,最后輸出的是6攀芯。
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
上面代碼中屯断,變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效侣诺,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量殖演,所以最后輸出的是6。
如果每一輪循環(huán)的變量i都是重新聲明的年鸳,那它怎么知道上一輪循環(huán)的值趴久,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值搔确,初始化本輪的變量i時(shí)彼棍,就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。
2膳算、不存在變量提升
var命令會(huì)發(fā)生”變量提升“現(xiàn)象座硕,即變量可以在聲明之前使用,值為undefined涕蜂。
而let命令改變了語(yǔ)法行為华匾,它所聲明的變量一定要在聲明后使用,否則報(bào)錯(cuò)机隙。
3蜘拉、暫時(shí)性死區(qū)
在代碼塊內(nèi),使用let命令聲明變量之前有鹿,該變量都是不可用的诸尽。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone印颤,簡(jiǎn)稱 TDZ)您机。
暫時(shí)性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域年局,所要使用的變量就已經(jīng)存在了际看,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn)矢否,才可以獲取和使用該變量仲闽。
4、let命令不允許重復(fù)聲明
二僵朗、塊級(jí)作用域
let實(shí)際上為 JavaScript 新增了塊級(jí)作用域赖欣。
塊級(jí)作用域的出現(xiàn)屑彻,實(shí)際上使得獲得廣泛應(yīng)用的立即執(zhí)行函數(shù)表達(dá)式(IIFE)不再必要了。
1顶吮、塊級(jí)作用域與函數(shù)聲明
ES6 引入了塊級(jí)作用域社牲,明確允許在塊級(jí)作用域之中聲明函數(shù)。ES6 規(guī)定悴了,塊級(jí)作用域之中搏恤,函數(shù)聲明語(yǔ)句的行為類似于let,在塊級(jí)作用域之外不可引用湃交。
對(duì)于 ES6 的瀏覽器實(shí)現(xiàn)熟空,以下三條規(guī)則有效,其他環(huán)境的實(shí)現(xiàn)不用遵守搞莺,還是將塊級(jí)作用域的函數(shù)聲明當(dāng)作let處理:
(1)允許在塊級(jí)作用域內(nèi)聲明函數(shù)息罗。
(2)函數(shù)聲明類似于var,即會(huì)提升到全局作用域或函數(shù)作用域的頭部才沧。
(3)同時(shí)迈喉,函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。
考慮到環(huán)境導(dǎo)致的行為差異太大糜工,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)弊添。如果確實(shí)需要录淡,也應(yīng)該寫(xiě)成函數(shù)表達(dá)式捌木,而不是函數(shù)聲明語(yǔ)句。
// 函數(shù)聲明語(yǔ)句
{
let a = 'secret';
function f() {
return a;
}
}
// 函數(shù)表達(dá)式
{
let a = 'secret';
let f = function () {
return a;
};
}
2嫉戚、Do 表達(dá)式
本質(zhì)上刨裆,塊級(jí)作用域是一個(gè)語(yǔ)句,將多個(gè)操作封裝在一起彬檀,沒(méi)有返回值帆啃。
為了使得塊級(jí)作用域可以變?yōu)楸磉_(dá)式,也就是說(shuō)可以返回值窍帝,可以在塊級(jí)作用域之前加上do努潘,使它變?yōu)閐o表達(dá)式。如:
let x = do {
let t = f();
t * t + 1;
};
三坤学、const命令
1疯坤、基本用法
const聲明一個(gè)只讀的常量。一旦聲明深浮,常量的值就不能改變压怠,const一旦聲明變量,就必須立即初始化飞苇,不能留到以后賦值菌瘫。
const PI = 3.1415;
const命令聲明的常量也是不提升蜗顽,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用雨让。
2雇盖、本質(zhì)
const實(shí)際上保證的,并不是變量的值不得改動(dòng)宫患,而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)刊懈。
對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值、字符串娃闲、布爾值)虚汛,值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量皇帮。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組)卷哩,變量指向的內(nèi)存地址,保存的只是一個(gè)指針属拾,const只能保證這個(gè)指針是固定的将谊,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了渐白。