一、let const
1、不存在变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
//=>
var foo;
console.log(foo);
foo = 2;
// let 的情况 不会变量提升,还是之前的代码
console.log(bar); // 报错ReferenceError
let bar = 2;
总结:let const所声明的变量一定要在声明后使用,否则报错。
2、暂时性死区 (简称 TDZ)
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
总结:只要块级作用域内存在
let命令,在代码块内,使用let命令声明变量之前,该变量都是不可用的,不再受外部的影响。
3、不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
4、块级作用域
5、const
const声明一个只读的常量,一旦声明,常量的值就不能改变。
二、变量的解构赋值
1、数组
let [a, b, c] = [1, 2, 3];
a //1
b //2
允许指定默认值
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
2、对象
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
允许指定默认值
var {x, y = 5} = {x: 1};
x // 1
y // 5
3、字符串
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"