ZetCode

JavaScript const 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将演示如何使用 const 关键字在 JavaScript 中声明常量。 我们将涵盖基本用法、作用域和重要行为。

const 关键字

const 关键字在 JavaScript 中声明块作用域常量。 一旦声明,标识符就不能被重新赋值。 这有助于防止代码中重要值的意外更改。

常量必须在声明期间初始化。 与 letvar 不同,您不能在未赋值的情况下声明 const。 常量的值不能通过重新赋值来改变。

但是,对于使用 const 声明的对象和数组,它们的属性或元素仍然可以被修改。 const 仅防止变量本身的重新赋值,而不是其内容的改变。

基本 const 声明

const 的最简单用法是声明一个原始常量。

main.js
const PI = 3.14159;
console.log(PI);

// PI = 3.14; // TypeError: Assignment to constant variable

在这里,我们声明了一个数学常量 PI。 尝试重新赋值它会抛出错误。 这说明了 const 声明的原始类型的不可变性。 该值在整个程序的执行过程中保持不变。

$ node main.js
3.14159

Const 与对象

虽然对象引用不能更改,但其属性可以被修改。

main.js
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 声明,也可以修改数组元素。

main.js
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

main.js
{
    const x = 10;
    console.log(x); // 10
}

// console.log(x); // ReferenceError: x is not defined

常量 x 只能在其块内访问。 尝试在外部访问它会抛出错误。 这种块作用域可以防止全局命名空间的污染并避免命名冲突。

$ node main.js
10

Const 在循环中

在循环中使用 const 会为每次迭代创建一个新常量。

main.js
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 声明被提升,但直到声明才被初始化。

main.js
// console.log(MY_CONST); // ReferenceError
const MY_CONST = 42;
console.log(MY_CONST);

在声明之前访问 MY_CONST 会因暂时性死区而导致 ReferenceError。 这种行为有助于通过防止在初始化之前访问变量来捕获错误。 始终在使用前声明常量。

$ node main.js
42

Object.freeze 与 const

要使对象真正不可变,请将 constObject.freeze 结合使用。

main.js
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 - 语言参考

在本文中,我们演示了如何使用 const 关键字在 JavaScript 中声明常量。 我们涵盖了基本用法、作用域和重要行为。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。