const
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Khai báo const khai báo các biến cục bộ có phạm vi block. Giá trị của một hằng số không thể thay đổi thông qua phép tái gán bằng toán tử gán, nhưng nếu hằng số là một đối tượng, các thuộc tính của nó có thể được thêm, cập nhật hoặc xóa.
Try it
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
Cú pháp
const name1 = value1;
const name1 = value1, name2 = value2;
const name1 = value1, name2 = value2, /* …, */ nameN = valueN;
nameN-
Tên của biến cần khai báo. Mỗi tên phải là một định danh JavaScript hợp lệ hoặc một mẫu binding destructuring.
valueN-
Giá trị khởi tạo của biến. Có thể là bất kỳ biểu thức hợp lệ nào.
Mô tả
Khai báo const rất giống với let:
-
Khai báo
constđược giới hạn trong phạm vi cả block lẫn function. -
Khai báo
constchỉ có thể được truy cập sau khi nơi khai báo được thực thi (xem temporal dead zone). Vì lý do này, khai báoconstthường được xem là không được hoisted. -
Khai báo
constkhông tạo thuộc tính trênglobalThiskhi được khai báo ở cấp cao nhất của script. -
Khai báo
constkhông thể được khai báo lại bởi bất kỳ khai báo nào khác trong cùng phạm vi. -
constbắt đầu khai báo, không phải câu lệnh. Điều đó có nghĩa là bạn không thể sử dụng khai báoconstđơn lẻ làm thân của một block (điều này hợp lý, vì không có cách nào để truy cập biến).jsif (true) const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
Trình khởi tạo cho hằng số là bắt buộc. Bạn phải chỉ định giá trị của nó trong cùng khai báo. (Điều này hợp lý, vì sau đó không thể thay đổi nó.)
const FOO; // SyntaxError: Missing initializer in const declaration
Khai báo const tạo ra một tham chiếu bất biến đến một giá trị. Nó không có nghĩa là giá trị mà nó giữ là bất biến — chỉ là định danh biến không thể được tái gán. Ví dụ, trong trường hợp nội dung là một đối tượng, điều này có nghĩa là nội dung của đối tượng (ví dụ: các thuộc tính của nó) có thể bị thay đổi. Bạn nên hiểu khai báo const là "tạo một biến có danh tính không thay đổi", không phải "có giá trị không thay đổi" — hay, "tạo bindings bất biến", không phải "giá trị bất biến".
Nhiều hướng dẫn phong cách lập trình (bao gồm của MDN) khuyến nghị sử dụng const thay vì let bất cứ khi nào một biến không được tái gán trong phạm vi của nó. Điều này làm rõ ý định rằng kiểu (hoặc giá trị, trong trường hợp primitive) của biến không bao giờ thay đổi. Những người khác có thể ưu tiên let cho các non-primitive bị biến đổi.
Danh sách theo sau từ khóa const được gọi là danh sách binding và được phân tách bằng dấu phẩy, trong đó các dấu phẩy không phải là toán tử dấu phẩy và các dấu = không phải là toán tử gán. Các trình khởi tạo của biến sau có thể tham chiếu đến các biến trước đó trong danh sách.
Ví dụ
>Cách dùng cơ bản của const
Hằng số có thể được khai báo bằng chữ hoa hoặc chữ thường, nhưng quy ước phổ biến là sử dụng toàn chữ hoa, đặc biệt là đối với các primitive vì chúng thực sự là bất biến.
// 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
Phạm vi block
Quan trọng là phải lưu ý đặc tính của phạm vi block.
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 trong đối tượng và mảng
const cũng hoạt động với đối tượng và mảng. Việc cố gắng ghi đè đối tượng sẽ ném lỗi "Assignment to constant variable".
const MY_OBJECT = { key: "value" };
MY_OBJECT = { OTHER_KEY: "value" };
Tuy nhiên, các khóa của đối tượng không được bảo vệ, vì vậy câu lệnh sau được thực thi mà không có vấn đề gì.
MY_OBJECT.key = "otherValue";
Bạn sẽ cần sử dụng Object.freeze() để làm cho đối tượng bất biến.
Điều tương tự áp dụng cho mảng. Gán một mảng mới cho biến sẽ ném lỗi "Assignment to constant variable".
const MY_ARRAY = [];
MY_ARRAY = ["B"];
Tuy nhiên, vẫn có thể đẩy các phần tử vào mảng và do đó làm thay đổi nó.
MY_ARRAY.push("A"); // ["A"]
Khai báo với destructuring
Vế trái của mỗi = cũng có thể là một mẫu binding. Điều này cho phép tạo nhiều biến cùng một lúc.
const result = /(a+)(b+)(c+)/.exec("aaabcc");
const [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"
Để biết thêm thông tin, xem Destructuring.
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-let-and-const-declarations> |