ES6之前,我们都是使用 var 来声明一个变量。在ES6中,又新增加了 let 和 const 关键字用来声明变量。那么它们之间有何不同呢?
下面本文将一一说明:
let
let的用法与var十分相似,只是在功能上有以下几点不同:
- let 声明的变量只在定义的代码块内有效。比如下面代码中输出b就会报错!
{ var a = 1; let b = 2; } console.log(a) // 1 console.log(b) // Uncaught ReferenceError: b is not defined
- let 声明的变量不会出现变量提升,即必须先声明再使用。比如下面代码中执行方法a()会报错!
function a () { console.log(b); let b = 2; } a(); // Uncaught ReferenceError: Cannot access 'b' before initialization
- 使用let声明会使块级作用域变为暂时性死区,即该代码块会与声明的变量绑定,不再受外部影响。这个理解起来有点难,我们看下面代码:
var b = 2; function a () { console.log(b); let b = 3; } a(); // Uncaught ReferenceError: Cannot access 'b' before initialization
可以看到,执行方法a()仍然报错,这就是因为a()内部使用let定义b,使得a()内部不受外面使用var定义的b影响。所以出现了与第2条相同的报错!
- 使用let声明的变量不允许在作用域内重复声明。这条就比较好理解来,看下面代码吧!
function a() { let b = 2; let b = 3; } a(); // Uncaught SyntaxError: Identifier 'b' has already been declared
const
const是对let的增强,它能阻止对一个变量再次赋值。简单来说就是const相当于用let声明了一个只读的变量。使用const时除了上面关于let的注意事项外,还要注意以下几点:
- const声明的变量必须在声明时立即赋值,不可留待以后。且声明后值不可更改。比如下面代码就会报错:
const a = 1; console.log(a); // 1 a = 2; // Uncaught TypeError: Assignment to constant variable. const b; // Uncaught SyntaxError: Missing initializer in const declaration
- const本质上保护的是变量指向的内存地址中保存的数据不可改动,这对于简单类型的数据而言,内存中保存的就是值本身。但是对于复合类型数据(对象和数组)来说,内存中保存的只是指向实际数据位置的指针,const只能保护这个指针不变。比如下面代码:
const a = { 'b': 1 } console.log(a); // {b:1} a.b = 2; // 不会报错 console.log(a); // {b:2} a = {}; // Uncaught TypeError: Assignment to constant variable.
可以看到,只有在试图将一个空对象赋值给a时才会报错。因此将一个对象或数组赋值给const变量必须非常谨慎!