在ES6(ECMAScript 2015)中,let 和 const 是两种用于声明变量的新命令,它们替代了传统的 var 命令。这两个命令提供了块级作用域(block scope),与 var 的函数级作用域(function scope)不同。下面是它们的详细解释:
let
let 关键字用于声明一个块级作用域的变量。这意味着变量只在声明它的块(由 {} 包围的代码块)内有效。
特点:
- 块级作用域:
let声明的变量只在包含它的块内有效。 - 不存在变量提升(hoisting)的初始化:虽然
let声明的变量也会被提升,但它们不会被初始化为undefined。在变量声明之前的访问会导致暂时性死区(Temporal Dead Zone, TDZ)错误。 - 可以在同一个作用域内重新赋值:使用
let声明的变量可以重新赋值。
示例:
{
let a = 10;
console.log(a); // 输出: 10
}
console.log(a); // 报错: a is not defined
// 暂时性死区示例
console.log(b); // 报错: Cannot access 'b' before initializationlet
b = 20;const
const 关键字用于声明一个块级作用域的常量。这意味着变量在声明后不能再被重新赋值(绑定)。
特点:
- 块级作用域:与
let类似,const声明的变量也只在包含它的块内有效。 - 必须初始化:使用
const声明的变量必须在声明时初始化,不能留空。 - 不可重新赋值:一旦
const变量被赋值,就不能再改变它的值(不过,如果变量是一个对象或数组,可以修改其内容,但不能重新赋值变量本身)。
示例:
{
const c = 30;
console.log(c); // 输出: 30
}
console.log(c); // 报错: c is not defined
// 必须初始化
const d = 40;
// const e;// 报错: Missing initializer in const declaration
// 对于对象或数组,可以修改其内容但不能重新赋值
const obj = { key: 'value' };
obj.key = 'new value';// 有效
console.log(obj.key); // 输出: new value
// obj = {}; // 报错: Assignment to constant variable.总结
let和const都提供块级作用域。let声明的变量可以在声明后重新赋值。const声明的变量必须在声明时初始化,并且在初始化后不能再重新赋值(但对象或数组的内容可以修改)。
选择使用 let 还是 const 取决于你是否需要在声明后重新赋值变量。如果不需要重新赋值,使用 const 是一个更好的实践,因为它可以使代码更易于理解和维护。