const

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

const 宣告用於宣告塊級作用域的區域性變數。常量的值不能透過使用賦值運算子重新賦值來改變,但如果常量是一個物件,則可以新增、更新或刪除其屬性。

試一試

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

語法

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® 2026 語言規範
# sec-let-and-const-declarations

瀏覽器相容性

另見