ES6的let和const

  • 2019 年 12 月 5 日
  • 筆記

本文作者:IMWeb ousiri 原文出處:IMWeb社區 未經同意,禁止轉載

let

  • let和var很相似,用於聲明一個變數。但是let聲明的變數只存在塊狀作用域內。
function order(x, y) {      if (x > y) { // (A)          let tmp = x;          x = y;          y = tmp;      }      console.log(tmp===x); // ReferenceError: tmp is not defined      return [x, y];  }
  • 使用大括弧代替立即執行函數{ let a = 123; } console.log(a); // ReferenceError: a is not defined

const

  • const則是用來聲明某個變數等於它初始化的值,並且不能再改變。同樣,const也是只存在塊狀作用域內的
const foo;  // SyntaxError: Missing initializer in const declaration    const bar = 123;  bar = 456; // TypeError: `bar` is read-only
  • 注意和Object.freeze的區別。PS:經庄希琦提醒,這裡可以借用指針的概念,obj指向了obj的指針,此指針不可變,但是對象內部的值還是可以改變的。
const obj = {a: 123};  obj.a = 234;  console.log(obj.a); // 234    const obj2 = Object.freeze({a:123});  obj.a = 234; // 這裡應該要報錯的,但是chrome現在沒有報錯  console.log(obj.a); // 123

Temporal Dead Zone (TDZ)

由let和const聲明的變數都會有自己的TDZ。當進入這個變數的作用域的時候,這個變數是不能被訪問的,直到這個變數被初始化。我們來看下面一段程式碼

let tmp = true;  if (true) { // enter new scope, TDZ starts      // Uninitialized binding for `tmp` is created      console.log(tmp); // ReferenceError        let tmp; // TDZ ends, `tmp` is initialized with `undefined`      console.log(tmp); // undefined        tmp = 123;      console.log(tmp); // 123  }  console.log(tmp); // true

TDZ的原因可以簡單地理解為,let和const不存在變數提升

並且要注意,這段程式碼經過babel編譯,結果會是:undefined, undefined, 123, true,不會報錯,因為babel是使用var去最大限度模擬let

何時使用let和const

  1. 儘可能使用const
  2. 當變數需要改變的時候,把const改為let

參考資料

Exploring ES6