試一試
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 |
瀏覽器相容性
載入中…