ES6中的let和const命令


ES6中的let和const命令


let命令

? ??ES6 新增了let命令,用來(lái)聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內(nèi)有效。(for循環(huán)的計(jì)數(shù)器,就很合適使用let命令)? ? ? ??

let不存在變量提升

? ? ? var命令會(huì)發(fā)生”變量提升“現(xiàn)象,即變量可以在聲明之前使用,值為undefined。這種現(xiàn)象多多少少是有些奇怪的,按照一般的邏輯,變量應(yīng)該在聲明語(yǔ)句之后才可以使用。? ? ? ??

為了糾正這種現(xiàn)象,let命令改變了語(yǔ)法行為,它所聲明的變量一定要在聲明后使用,否則報(bào)錯(cuò)。

上面代碼中,變量foo用var命令聲明,會(huì)發(fā)生變量提升,即腳本開(kāi)始運(yùn)行時(shí),變量foo已經(jīng)存在了,但是沒(méi)有值,所以會(huì)輸出undefined。變量bar用let命令聲明,不會(huì)發(fā)生變量提升。這表示在聲明它之前,變量bar是不存在的,這時(shí)如果用到它,就會(huì)拋出一個(gè)錯(cuò)誤。

暫時(shí)性死區(qū)

????????只要塊級(jí)作用域內(nèi)存在let命令,它所聲明的變量就“綁定”(binding)這個(gè)區(qū)域,不再受外部的影響。


上面代碼中,存在全局變量tmp,但是塊級(jí)作用域內(nèi)let又聲明了一個(gè)局部變量tmp,導(dǎo)致后者綁定這個(gè)塊級(jí)作用域,所以在let聲明變量前,對(duì)tmp賦值會(huì)報(bào)錯(cuò)。ES6 明確規(guī)定,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開(kāi)始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。總之,在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡(jiǎn)稱 TDZ)。

let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量。

因此,不能在函數(shù)內(nèi)部重新聲明參數(shù)。

const命令


基本語(yǔ)法

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

上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。

const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)。? ??


?01:const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。

02:const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。

03:const聲明的常量,也與let一樣不可重復(fù)聲明。



const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)


const

????????對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,const只能保證這個(gè)指針是固定的(即總是指向另一個(gè)固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個(gè)對(duì)象聲明為常量必須非常小心。

上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址,這個(gè)地址指向一個(gè)對(duì)象。不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性。

作者:Li Shuan丶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容