一:let es6
相似var 可是所聲明的變量,只在let
命令所在的代碼塊內有效。數組
1) 不存在變量提高 數據結構
// var 的狀況 console.log(foo); // 輸出undefined var foo = 2; // let 的狀況 console.log(bar); // 報錯ReferenceError let bar = 2;
2)暫時性死區
暫時性死區的本質就是,只要一進入當前做用域,所要使用的變量就已經存在了,可是不可獲取,只有等到聲明變量的那一行代碼出現,才能夠獲取和使用該變量。函數
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
3)不容許重複聲明spa
let
不容許在相同做用域內,重複聲明同一個變量。 所以,不能在函數內部從新聲明參數。指針
// 報錯 function func() { let a = 10; var a = 1; } // 報錯 function func() { let a = 10; let a = 1; } function func(arg) { let arg; } func() // 報錯 function func(arg) { { let arg; } } func() // 不報錯
二:constcode
const
聲明一個只讀的常量。一旦聲明,常量的值就不能改變。具備上述let的屬性 對象
const
聲明的變量不得改變值,這意味着,const
一旦聲明變量,就必須當即初始化,不能留到之後賦值。blog
const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable. const foo; // SyntaxError: Missing initializer in const declaration
const
實際上保證的,並非變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。內存
對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。
但對於複合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const
只能保證這個指針是固定的(即老是指向另外一個固定的地址),至於它指向的數據結構是否是可變的,就徹底不能控制了
const foo = {}; // 爲 foo 添加一個屬性,能夠成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另外一個對象,就會報錯 foo = {}; // TypeError: "foo" is read-only