ES6里let、const、var區別總結


 首先了解下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM