试一试
const number = 42;
try {
number = 99;
} catch (err) {
console.log(err);
// Expected output: TypeError: invalid assignment to const 'number'
// (Note: the exact output may be browser-dependent)
}
console.log(number);
// Expected output: 42
语法
const name1 = value1;
const name1 = value1, name2 = value2;
const name1 = value1, name2 = value2, /* …, */ nameN = valueN;
描述
const 声明与 let 非常相似。
-
const声明的作用域是块以及函数。 -
在脚本的顶层声明时,
const声明不会在globalThis上创建属性。 -
const声明不能在同一作用域内被任何其他声明重新声明。 -
const开始声明,而不是语句。这意味着你不能将单独的const声明用作块的主体(这是有道理的,因为无法访问该变量)。jsif (true) const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
常量需要一个初始化器。你必须在同一声明中指定其值。(这是有道理的,因为它以后不能被改变。)
const FOO; // SyntaxError: Missing initializer in const declaration
const 声明创建了一个对值的不可变引用。它并不意味着它所持有的值是不可变的——只是变量标识符不能被重新赋值。例如,在内容是对象的情况下,这意味着对象的内容(例如,其属性)可以被改变。你应该将 const 声明理解为“创建一个其标识保持不变的变量”,而不是“创建一个其值保持不变的变量”——或者说,“创建不可变的绑定”,而不是“不可变的值”。
许多风格指南(包括 MDN 的)建议,只要变量在其作用域内不被重新赋值,就使用 const 而不是 let。这使得意图清晰,即变量的类型(或原始值的值)永远不会改变。其他人可能更喜欢对被改变的非原始类型使用 let。
const 关键字后面跟着的列表称为绑定列表,并用逗号分隔,其中逗号不是逗号运算符,= 符号不是赋值运算符。列表中后面变量的初始化器可以引用前面变量。
示例
const 的基本用法
常量可以用大写或小写声明,但一个常见的惯例是使用全大写字母,特别是对于原始类型,因为它们是真正不可变的。
// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;
console.log(`my favorite number is: ${MY_FAV}`);
// Re-assigning to a constant variable throws an error
MY_FAV = 20; // TypeError: Assignment to constant variable
// Redeclaring a constant throws an error
const MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
var MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
let MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
块级作用域
注意块级作用域的本质很重要。
const MY_FAV = 7;
if (MY_FAV === 7) {
// This is fine because it's in a new block scope
const MY_FAV = 20;
console.log(MY_FAV); // 20
// var declarations are not scoped to blocks so this throws an error
var MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
}
console.log(MY_FAV); // 7
对象和数组中的 const
const 也适用于对象和数组。尝试覆盖对象会抛出“Assignment to constant variable”错误。
const MY_OBJECT = { key: "value" };
MY_OBJECT = { OTHER_KEY: "value" };
然而,对象键不受保护,因此以下语句执行时没有问题。
MY_OBJECT.key = "otherValue";
你需要使用 Object.freeze() 来使对象不可变。
数组也是如此。为变量分配一个新数组会抛出“Assignment to constant variable”错误。
const MY_ARRAY = [];
MY_ARRAY = ["B"];
尽管如此,仍然可以将项目推入数组,从而改变它。
MY_ARRAY.push("A"); // ["A"]
使用解构进行声明
每个 = 的左侧也可以是一个绑定模式。这允许一次创建多个变量。
const result = /(a+)(b+)(c+)/.exec("aaabcc");
const [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"
欲了解更多信息,请参阅解构。
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-let-and-const-declarations |
浏览器兼容性
加载中…