1. 程式人生 > >ES6入門教程筆記(2)-let、const和var的區別

ES6入門教程筆記(2)-let、const和var的區別

1 let命令

ES6新增了let命令,用來宣告變數。它的用法和var類似,但有以下幾點區別:

  • let宣告的變數,只在所在的程式碼塊內有效。
  • let宣告的變數,一定要在聲明後才能使用,否則報錯。
  • 不允許在相同作用域內,重複宣告同一個變數。

2 塊級作用域

ES5只有全域性作用域和函式作用域,沒有塊級作用域。

let實際上新增了塊級作用域的概念,塊作用域由 { } 包括,if語句和for語句裡面的{ }也屬於塊作用域。

function f1() {
    let n = 3;
    if (true) {
        let n = 100;
        console.log(n); // 100
    }
    console.log(n); // 3
}

3 const命令

const的用法和作用域和let一樣,但是const用來宣告一個只讀的常量,而且在宣告時就必須立即初始化,不能留到後面再賦值。

const PI = 3.14159;
PI // 3.14159

PI = 10; // TypeError

const實際上保證的,只是變數指向的記憶體地址不能改動。

對於簡單型別的資料(數值、字串),值就儲存在那個記憶體地址,因此等同於常量。但對於複合型別的資料(物件和陣列),變數儲存的只是一個指向實際資料的指標,這個指標保證固定不變,但指標指向的資料記憶體是不是可以改變,就不能控制了。

const foo = {};

// 成功新增一個屬性
foo.prop = 123;
foo.prop // 123

// 指向另一個物件,就會報錯
foo = {}; // TypeError

ES6宣告變數的六種方法

ES5 只有兩種宣告變數的方法:var命令和function命令。

ES6 除了新增letconst命令,還有另外兩種宣告變數的方法:import命令和class命令。所以,ES6 一共有 6 種宣告變數的方法。

4 頂層物件的屬性

頂層物件,在瀏覽器環境指的是window物件,在 Node 指的是global物件。ES5 之中,頂層物件的屬性與全域性變數是等價的。

windows.a = 1;
a // 1

a = 2; 
window.a // 2

ES6 為了改變這一點,一方面規定,為了保持相容性,var命令和function命令宣告的全域性變數,依舊是頂層物件的屬性;另一方面規定,let、const、class命令宣告的全域性變數,不屬於頂層物件的屬性。

也就是說,從 ES6 開始,全域性變數將逐步與頂層物件的屬性脫鉤。

var a = 1;
window.a // 1

let b = 1;
window.b // undefined

注:本文原始內容來自 ES6標準入門,有修改。