區(qū)別:1、let聲明的是變量,其值和類(lèi)型都可以改變,而const聲明的是常量,不可以改變,不能重新賦值;2、let變量,聲明后可以不初始化,而const常量,一旦聲明,就必須立即初始化;3、const總是指向一個(gè)固定的地址,而let不固定。
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
let和const是在es6中新引入了兩種方式來(lái)申明變量的關(guān)鍵字,雖然我們?nèi)匀豢梢允褂脧V為傳誦的var變量,但是現(xiàn)在我們有了兩種更牛的工具去使用:let和const。
es6中l(wèi)et和const的區(qū)別
① let聲明的是變量,其值和類(lèi)型都可以改變;const聲明的是常量,其值和類(lèi)型都不可以改變。
② let變量,聲明后可以不初始化,而const常量,一旦聲明,就必須立即初始化,不能以后再賦值。
const i ; // 報(bào)錯(cuò),一旦聲明,就必須立即初始化 const j = 5; j = 10; // 報(bào)錯(cuò),常量不可以改變
③ const總是指向一個(gè)固定的地址,而let不固定
const foo = {}; // 為 foo 添加一個(gè)屬性,可以成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò) foo = {}; // TypeError: "foo" is read-only
上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址,這個(gè)地址指向一個(gè)對(duì)象。不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性。
說(shuō)明:
數(shù)組和對(duì)象等復(fù)合類(lèi)型的變量,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const只保證變量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變,所以將一個(gè)復(fù)合類(lèi)型的變量聲明為常量必須非常小心。
const arr = []; // 報(bào)錯(cuò),[1,2,3]與[]不是同一個(gè)地址 arr = [1,2,3]; const arr = []; // 不報(bào)錯(cuò),變量名arr指向的地址不變,只是數(shù)據(jù)改變 arr[0] = 1; arr[1] = 2; arr[2] = 3; console.log(arr.length); // 輸出:3
es6中l(wèi)et和const的相同點(diǎn):
① 只在聲明所在的塊級(jí)作用域內(nèi)有效。
② 不存在聲明提升,同時(shí)存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。
<script type="text/javascript"> console.log(dadi); let dadi = 569; </script>
結(jié)果:會(huì)報(bào)錯(cuò)
③ 不可重復(fù)聲明。
【