ES6之let和const命令
var、let、const对比
var
变量提升
console.log(x);// undefined
var x;
按照正常的代码解析步骤:打印变量x
在声明之前,因此会报错ReferenceError:x is not defined
;但是结果确实undefined
。正是由于var
声明变量将会导致变量提升至最顶部,即在打印之前
重复声明
var x=5;
console.log(x);// 5
var x=10;
console.log(x);// 10
var
支持重复声明变量
let
ES6新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
块级作用域
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
暂时性死区,只可在声明位置后使用
let a=10;
{
console.log(a);// 10
}
在打印变量a
前已声明该变量
let a=10;
{
console.log(a);// ReferenceError: Cannot access 'a' before initialization
let a=5;
}
由于在作用域中重新声明了a
,则将该作用域中的a
绑定在此作用域,而此作用域中的变量声明位于打印之后,故报错
不允许重复声明
let a = 10;
let a = 12;// SyntaxError: Identifier 'a' has already been declared
let
命令不支持重复声明
推荐适用范围
- 块级作用域
- for循环
const
const声明一个只读的常量。一旦声明,常量的值就不能改变。
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
声明常量,改变报错
const a = 10;
a = 12;// TypeError: Assignment to constant variable.
const
声明的变量不允许修改
指向复合型变量地址
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // TypeError: Assignment to constant variable.
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
块级作用域
类似与let
命令
暂时性死区,只可在声明位置后使用
类似与let
命令
不允许重复声明
类似与let
命令
推荐适用范围
- 常量
- 块级作用域