JavaScript const 关键字
最后修改于 2025 年 4 月 16 日
在本文中,我们将演示如何使用 const 关键字在 JavaScript 中声明常量。 我们将涵盖基本用法、作用域和重要行为。
const 关键字
const 关键字在 JavaScript 中声明块作用域常量。 一旦声明,标识符就不能被重新赋值。 这有助于防止代码中重要值的意外更改。
常量必须在声明期间初始化。 与 let 和 var 不同,您不能在未赋值的情况下声明 const。 常量的值不能通过重新赋值来改变。
但是,对于使用 const 声明的对象和数组,它们的属性或元素仍然可以被修改。 const 仅防止变量本身的重新赋值,而不是其内容的改变。
基本 const 声明
const 的最简单用法是声明一个原始常量。
const PI = 3.14159; console.log(PI); // PI = 3.14; // TypeError: Assignment to constant variable
在这里,我们声明了一个数学常量 PI。 尝试重新赋值它会抛出错误。 这说明了 const 声明的原始类型的不可变性。 该值在整个程序的执行过程中保持不变。
$ node main.js 3.14159
Const 与对象
虽然对象引用不能更改,但其属性可以被修改。
const person = {
name: 'John',
age: 30
};
person.age = 31; // Allowed
console.log(person);
// person = { name: 'Jane' }; // TypeError
这表明虽然我们不能重新赋值 person 常量,但我们可以修改其属性。 const 声明保护的是绑定,而不是对象的内容。 在使用对象时,理解这种行为很重要。
$ node main.js
{ name: 'John', age: 31 }
Const 与数组
与对象类似,即使使用 const 声明,也可以修改数组元素。
const colors = ['red', 'green', 'blue'];
colors.push('yellow');
console.log(colors);
// colors = ['purple']; // TypeError
我们可以修改数组的内容,但不能重新赋值 colors 常量。 这表明 const 保护的是数组引用,而不是其元素。 数组方法,如 push、pop 和 splice,仍然可以对 const 数组起作用。
$ node main.js [ 'red', 'green', 'blue', 'yellow' ]
const 的块作用域
使用 const 声明的常量具有块作用域,类似于 let。
{
const x = 10;
console.log(x); // 10
}
// console.log(x); // ReferenceError: x is not defined
常量 x 只能在其块内访问。 尝试在外部访问它会抛出错误。 这种块作用域可以防止全局命名空间的污染并避免命名冲突。
$ node main.js 10
Const 在循环中
在循环中使用 const 会为每次迭代创建一个新常量。
for (const i = 0; i < 3; i++) {
console.log(i); // Works only once
}
// Better usage in for...of loops
const arr = [1, 2, 3];
for (const num of arr) {
console.log(num);
}
第一个循环失败,因为 i 无法递增。 但是,for...of 循环与 const 配合得很好,因为每次迭代都会获得一个新常量。 当您不需要修改循环变量时,这是一种常见的模式。
$ node main.js 0 TypeError: Assignment to constant variable
暂时性死区
与 let 类似,const 声明被提升,但直到声明才被初始化。
// console.log(MY_CONST); // ReferenceError const MY_CONST = 42; console.log(MY_CONST);
在声明之前访问 MY_CONST 会因暂时性死区而导致 ReferenceError。 这种行为有助于通过防止在初始化之前访问变量来捕获错误。 始终在使用前声明常量。
$ node main.js 42
Object.freeze 与 const
要使对象真正不可变,请将 const 与 Object.freeze 结合使用。
const settings = Object.freeze({
theme: 'dark',
fontSize: 14
});
// settings.theme = 'light'; // Error in strict mode
console.log(settings);
这将创建一个深度不可变的常量。 虽然 const 阻止了重新赋值,但 Object.freeze 阻止了属性修改。 它们一起为对象提供对其顶级属性的完全不可变性。
$ node main.js
{ theme: 'dark', fontSize: 14 }
来源
在本文中,我们演示了如何使用 const 关键字在 JavaScript 中声明常量。 我们涵盖了基本用法、作用域和重要行为。