const
试试看
语法
描述
const
声明与 let
非常相似
const
声明的作用域也包括块和函数。- 只有在达到声明位置后才能访问
const
声明(参见 暂时性死区)。因此,const
声明通常被认为是 未提升的。 - 在脚本的顶层声明
const
声明不会在globalThis
上创建属性。 const
声明不能被相同作用域中的任何其他声明 重新声明。const
开始 声明,而不是语句。这意味着您不能使用单独的const
声明作为块的主体(这是有道理的,因为没有办法访问变量)。jsif (true) const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
常量的初始化程序是必需的。您必须在相同的声明中指定其值。(鉴于以后不能更改它,这是有道理的。)
js
const FOO; // SyntaxError: Missing initializer in const declaration
const
声明创建对值的不可变引用。它并不意味着它持有的值是不可变的——只是变量标识符不能重新赋值。例如,在内容为对象的情况下,这意味着对象的内容(例如,其属性)可以更改。您应该将 const
声明理解为“创建其标识保持不变的变量”,而不是“其值保持不变的变量”——或者,“创建不可变的 绑定”,而不是“不可变的值”。
许多风格指南(包括 MDN 的)建议在变量在其作用域中未重新赋值时使用 const
而不是 let
。这使得意图很明确,即变量的类型(或在基本类型情况下为值)永远不会改变。其他人可能更喜欢 let
用于被修改的非基本类型。
const
关键字后面的列表称为绑定 列表,并用逗号分隔,其中逗号不是 逗号运算符,=
符号不是 赋值运算符。后面变量的初始化程序可以引用列表中前面的变量。
示例
基本的 const 用法
常量可以用大写或小写声明,但一个常见的约定是使用全大写字母,特别是对于基本类型,因为它们是真正不可变的。
js
// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;
console.log("my favorite number is: " + MY_FAV);
js
// 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
块级作用域
需要注意块级作用域的本质。
js
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”。
js
const MY_OBJECT = { key: "value" };
MY_OBJECT = { OTHER_KEY: "value" };
但是,对象键不受保护,因此以下语句将顺利执行。
js
MY_OBJECT.key = "otherValue";
您需要使用 Object.freeze()
使对象不可变。
这同样适用于数组。将新数组分配给变量会抛出错误“Assignment to constant variable”。
js
const MY_ARRAY = [];
MY_ARRAY = ["B"];
尽管如此,仍然可以将项目推入数组并因此对其进行修改。
js
MY_ARRAY.push("A"); // ["A"]
使用解构进行声明
每个 =
的左侧也可以是绑定模式。这允许一次创建多个变量。
js
const result = /(a+)(b+)(c+)/.exec("aaabcc");
const [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"
有关更多信息,请参见 解构赋值。
规范
规范 |
---|
ECMAScript 语言规范 # sec-let-and-const-declarations |
浏览器兼容性
BCD 表格仅在浏览器中加载