let/const
是ES6
新增的聲明變量的關(guān)鍵詞鲫剿,和ES5
的var
相比有以下幾個特點
- 基本使用
- 塊級作用域
- 不存在變量提升
- 不允許重復(fù)聲明
- 暫時性死區(qū)
基本使用
let
用于聲明一個變量
const
用于聲明常量蹲缠,const
一旦聲明之后益缠,其值就不能修改,所以這就意味著const
必須在聲明的同時進行初始化
const a // Uncaught SyntaxError: Missing initializer in const declaration
const
不能被修改的本質(zhì)是保證了其聲明的常量所指向的內(nèi)存地址保存的數(shù)據(jù)不得改變笨使,也就是說對于簡單類型(指向的內(nèi)存地址保存了值)值不得改變拆撼,對于引用類型(指向的內(nèi)存地址保存了對象的引用)則是引用的對象不得改變?yōu)橐闷渌麑ο螅灰玫膶ο蟊旧硎强梢孕薷牡?/p>
const a = 'a string'
a = 'a new string' // Uncaught TypeError: Assignment to constant variable.
const b = { name: 'Tom' }
b.age = '28'
console.log(b) // {name: "Tom", age: "28"}
b = { name: 'Jack' } // Uncaught TypeError: Assignment to constant variable.
在實際的項目中祟辟,常量聲明使用const
,好處是可以V8引擎對const
有優(yōu)化侣肄,而且可以避免不小心改變值旧困。對于某些不可改變引用的對象,推薦也使用const
進行約束
塊級作用域
在ES5
中,js不存在塊級作用域吼具,
不存在變量提升
var
存在變量提升僚纷,也就是可以先使用后聲明,在聲明之前使用時其值為undefined
console.log(`a = ${a}`) // a = undefined
var a = 5
console.log(`b = $拗盒`) // Uncaught ReferenceError: b is not defined
let b = 5
不允許重復(fù)聲明
在相同的作用域內(nèi)怖竭,let/const
不允許重復(fù)聲明同一個變量
{
var a = 5
var a = `a string`
console.log(a) // a string
}
{
let a = 5
let a = `a string` // Identifier 'a' has already been declared
}
暫時性死區(qū)
ES6
明確規(guī)定,如果區(qū)塊中存在let/const
命令陡蝇,這個區(qū)塊對這些命令聲明的變量痊臭,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量登夫,就會報錯广匙。
if (true) {
// TDZ開始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ結(jié)束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
由于死區(qū)會拋出異常,所以在項目中一定要先聲明后使用