变常量的扩展
概述
在ES6中可以使用两个新的命令来声明变量:
- const:声明常量
- let:声明变量
ES6之前,JavaScript没有块级作用域的概念,而在ES6中const与let声明的变量作用范围仅限于块级区域(ES6引入了块级作用域)。 ES6还引入了一个新的概念TDZ(Temporal Dead Zone,暂存死区):初始化前的变量或参数不能被访问,也就是说let与const声明的变量直到控制流到达该变量被定义的代码行时才会被装载,而在这之前使用该变量会报错。
const
const声明块级作用域的常量。不可重复声明且一旦声明,常量的值就不能改变。
示例
console.log(cool); // 报错 Uncaught ReferenceError: cool is not defined const test = "cool" { const test = "爽"; // 报错 Uncaught SyntaxError: Identifier 'test' has already been declared const test1 = "xxx"; } console.log(test1); // Uncaught ReferenceError: test1 is not defined
注意事项
const声明的变量值不能改变指的是该变量所指向的内存地址不变,所以当声明的变量是复合类型的数据时,还是可以改变变量的值的,因为改变值的时候并没有改变其内存地址。
const obj = {}; obj.x = 1; obj = {}; // 这会改变obj的内存地址,所以会报错Uncaught TypeError: Assignment to constant variable.
let
let声明块级作用域的变量。不可重复声明。
示例
console.log(x); // 错误Uncaught ReferenceError: x is not defined let x = 1; let x = 2; // 错误Uncaught SyntaxError: Identifier 'x' has already been declared if(true) {let y = 1;} console.log(y) // Uncaught ReferenceError: y is not defined