变常量的扩展

 

概述

在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