const

const 声明声明块级局部变量。常量的值不能通过使用 赋值运算符 重新赋值来更改,但如果常量是 对象,则可以添加、更新或删除其属性。

试试看

语法

js
const name1 = value1;
const name1 = value1, name2 = value2;
const name1 = value1, name2 = value2, /* …, */ nameN = valueN;
nameN

要声明的变量的名称。每个名称必须是合法的 JavaScript 标识符解构绑定模式

valueN

变量的初始值。它可以是任何合法的表达式。

描述

const 声明与 let 非常相似

  • const 声明的作用域也包括块和函数。
  • 只有在达到声明位置后才能访问 const 声明(参见 暂时性死区)。因此,const 声明通常被认为是 未提升的
  • 在脚本的顶层声明 const 声明不会在 globalThis 上创建属性。
  • const 声明不能被相同作用域中的任何其他声明 重新声明
  • const 开始 声明,而不是语句。这意味着您不能使用单独的 const 声明作为块的主体(这是有道理的,因为没有办法访问变量)。
    js
    if (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 表格仅在浏览器中加载

另请参阅