let/const
2019-05-05 本文已影响0人
卡卡的尼奇
let/const
是ES6
新增的声明变量的关键词,和ES5
的var
相比有以下几个特点
- 基本使用
- 块级作用域
- 不存在变量提升
- 不允许重复声明
- 暂时性死区
基本使用
let
用于声明一个变量
const
用于声明常量,const
一旦声明之后,其值就不能修改,所以这就意味着const
必须在声明的同时进行初始化
const a // Uncaught SyntaxError: Missing initializer in const declaration
const
不能被修改的本质是保证了其声明的常量所指向的内存地址保存的数据不得改变,也就是说对于简单类型(指向的内存地址保存了值)值不得改变,对于引用类型(指向的内存地址保存了对象的引用)则是引用的对象不得改变为引用其他对象,被引用的对象本身是可以修改的
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
有优化,而且可以避免不小心改变值。对于某些不可改变引用的对象,推荐也使用const
进行约束
块级作用域
在ES5
中,js不存在块级作用域,
不存在变量提升
var
存在变量提升,也就是可以先使用后声明,在声明之前使用时其值为undefined
console.log(`a = ${a}`) // a = undefined
var a = 5
console.log(`b = ${b}`) // Uncaught ReferenceError: b is not defined
let b = 5
不允许重复声明
在相同的作用域内,let/const
不允许重复声明同一个变量
{
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
}
暂时性死区
ES6
明确规定,如果区块中存在let/const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
由于死区会抛出异常,所以在项目中一定要先声明后使用