ES6入門教程筆記(2)-let、const和var的區別
阿新 • • 發佈:2019-01-14
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 除了新增let
和const
命令,還有另外兩種宣告變數的方法: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標準入門,有修改。