Từ khóa const (ES2015/ES6) dùng để khai báo **hằng số** - biến không thể gán lại (reassign) sau khi khởi tạo.
Đặc điểm quan trọng:
- Block-scoped (phạm vi khối - trong cặp
{}) - Phải khởi tạo giá trị ngay khi khai báo
- Không thể gán lại (reassignment):
const a = 1; a = 2; // TypeError - Object/Array khai báo const VẪN CÓ THỂ THAY ĐỔI NỘI DUNG (mutation)
Ví dụ minh họa
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Const trong JavaScript</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.sample { font-size: 18px; font-weight: 500; margin: 10px 0; color: red; }
button { padding: 8px 16px; cursor: pointer; }
</style>
</head>
<body>
<h1>Const Example - Hằng số JavaScript</h1>
<button class="Btn" id="btn">NHẤN VÀO ĐÂY</button>
<p class="sample" id="sample"></p>
<h3> Nhấn nút để thử thay đổi giá trị const </h3>
<script>
const sampleEle = document.querySelector("#sample");
const a = 33; // Hằng số số nguyên
sampleEle.innerHTML = "a = " + a + "
";
document.querySelector("#btn").addEventListener("click", () => {
try {
a = 44; // Thử gán lại -> TypeError
} catch (err) {
sampleEle.innerHTML += "Lỗi: " + err.message + "
";
sampleEle.innerHTML += "Loại lỗi: " + err.name + "
";
sampleEle.innerHTML += "→ const không thể gán lại giá trị!
";
}
// Demo: const object VẪN có thể mutation
sampleEle.innerHTML += "
--- Const Object Mutation ---
";
const user = { name: "Rohan", age: 22 };
sampleEle.innerHTML += "Trước: " + JSON.stringify(user) + "
";
user.age = 23; // OK - mutation
user.city = "Hanoi"; // OK - thêm property
sampleEle.innerHTML += "Sau mutation: " + JSON.stringify(user) + "
";
// user = {}; // Lỗi: Assignment to constant variable
});
</script>
</body>
</html>
Kết quả
a = 33
Lỗi: Assignment to constant variable
Loại lỗi: TypeError
→ const không thể gán lại giá trị!
--- Const Object Mutation ---
Trước: {"name":"Rohan","age":22}
Sau mutation: {"name":"Rohan","age":23,"city":"Hanoi"}
Const vs Let vs Var:
| Đặc điểm | var | let | const |
|---|---|---|---|
| Phạm vi | Function-scoped | Block-scoped | Block-scoped |
| Hoisting | Có (khởi tạo undefined) | Có (TDZ - Temporal Dead Zone) | Có (TDZ) |
| Gán lại (reassign) | OK | OK | ❌ Lỗi |
| Khai báo lại (redeclare) | OK | ❌ Lỗi | ❌ Lỗi |
| Phải khởi tạo ngay | Không | Không | Có |
Best Practice:
- Mặc định dùng
constcho mọi khai báo - Chỉ dùng
letkhi **cần** gán lại giá trị - Tránh
vartrong code hiện đại - Đặt tên const UPPER_SNAKE_CASE cho hằng số thực sự (config, magic numbers):
const MAX_RETRY = 3;