const (constant) khai báo biến chỉ đọc (read-only reference) – không thể gán lại giá trị mới. Ra mắt ES6 (2015), là cách khai báo mặc định khuyến nghị hiện nay.
Đặc điểm chính
- Block scope – giới hạn trong cặp
{ }gần nhất. - Không hoisting usable – ở TDZ (Temporal Dead Zone) trước dòng khai báo.
- Bắt buộc khởi tạo ngay –
const x;báo lỗi SyntaxError. - Không gán lại (re-assign) –
x = 2báo TypeError. - Không khai báo lại (re-declare) –
const x = 1; const x = 2;báo SyntaxError.
Cú pháp
const PI = 3.14159;
const USER_ROLES = ["admin", "editor", "viewer"];
const CONFIG = { apiUrl: "/api", timeout: 5000 };
Lưu ý quan trọng: Const ≠ Immutable
const bảo vệ binding (liên kết biến), không bảo vệ giá trị object/array.
// Object/Array: Vẫn sửa ĐƯỢC nội dung
const user = { name: "An" };
user.name = "Binh"; // ✅ OK - sửa property
user.age = 25; // ✅ OK - thêm property
// user = {}; // ❌ TypeError - gán lại biến
const arr = [1, 2];
arr.push(3); // ✅ OK - sửa mảng
arr[0] = 10; // ✅ OK
// arr = []; // ❌ TypeError
// Primitive: Không sửa được (vì immutable bản chất)
const x = 10;
// x = 20; // ❌ TypeError
Để làm object/array thực sự bất biến
// Shallow freeze
const obj = Object.freeze({ a: 1, b: { c: 2 } });
obj.a = 10; // ❌ TypeError (strict mode) hoặc fail silently
obj.b.c = 20; // ✅ Vẫn sửa được nested object (shallow only)
// Deep freeze (đệ quy)
function deepFreeze(obj) {
Object.freeze(obj);
Object.keys(obj).forEach(key => {
if (typeof obj[key] === "object" && obj[key] !== null) {
deepFreeze(obj[key]);
}
});
return obj;
}
Ví dụ từ bài gốc
// Khai báo hằng số
const a = 150;
// ❌ Các thao tác SAI dưới đây:
a = 0; // TypeError: Assignment to constant variable
a++; // TypeError
var a = 0; // SyntaxError: Identifier 'a' has already been declared
Khi nào dùng const/let/var?
- const – Mặc định cho mọi khai báo (primitive, object, array, function).
- let – Khi CẦN gán lại giá trị (counter, swap, accumulator).
- var – Chỉ cho code legacy (pre-ES6), tránh trong code mới.
Temporal Dead Zone (TDZ)
{
// TDZ bắt đầu
console.log(x); // ReferenceError
const x = 10; // Khai báo - kết thúc TDZ
console.log(x); // 10
}
Best Practice
- Dùng
constcho 95% khai báo. - Đặt tên hằng số toàn cục UPPER_SNAKE_CASE:
API_URL,MAX_RETRY. - Dùng
Object.freeze()cho config object không muốn thay đổi. - Kết hợp với destructuring:
const { name, age } = user;