首先了解下let與var的區別,主要有以下3點:
1、var在js中是支持預解析的,而let不支持預解析,也就是變量提升的區別
console.log(a) var a = 22; // 打印undefined console.log(b) let b = 22 // 報錯:b is not defined
2、var可以重復定義同一個變量,但是let不可以
var a = 100; var a = 200; console.log(a) // 200 let a = 100; let a = 200; console.log(a) // 報錯:Identifier 'a' has already been declared
3、let可以形成塊級作用域,在es6之前js只有函數作用域,沒有塊級作用域。
在es6之前我們是怎么實現塊級作用域的呢?有朋友已經猜到了,立即執行函數表達式,簡稱IIFF。
(function () { var aa = 200 })() console.log(aa) // 報錯:aa is not defined
可以看到通過一個立即執行函數表達式,我們實現了一個局部作用域或者塊級作用域,但是有了let之后就不需要寫這樣的代碼了,只需要一個大括號內即實現塊級作用域。
{ let bb = 200 } console.log(bb) // 報錯:bb is not defined
4、var定義的全局變量會掛載到window對象上,使用window可以訪問,let定義的全局變量則不會掛載到window對象上
var f = 200; window.f // 200 let g = 200; window.g // undefined
下面談一下const的區別,以上四點完全適用const,但是const與let或是var還有兩點不同
1、const是用來定義常量的,常量定義之后是不允許改變的。
const AA = 200; AA = 100; // 報錯:Assignment to constant variable.
錯誤提示為:Uncaught TypeError: Assignment to constant variable.意思是常量已經賦值了。
這里有一個小坑,看如下代碼:
const BB = {} BB.a = 200 console.log(BB)
結果打印:{a:200},沒有報錯,並且賦值成功。
為什么 ?因為BB的值並沒有改變,依然指向剛開始賦值的那個對象,並沒有重新賦值,如果將BB重新賦值,就會報錯了,大家可以試試。其實就是引用變量與普通變量的區別。
所以用const定義的常量只要是引用類型數據,改變這個引用類型數據的結構或屬性,都是允許的。引用類型包括哪些呢?數組和對象。
2、用const定義常量必須賦值。不賦值的話,沒有任何意思,所以報錯。
const CC // 報錯:Missing initializer in const declaration