Hai khái niệm hoàn toàn khác nhau:
- const — ràng buộc biến (binding): không gán lại biến được.
- Object.freeze() — ràng buộc giá trị object (value): không mutate object được.
const — Không ngăn chặn mutation
<script>
const person = { name: 'Suresh', country: 'India' };
person.country = 'England'; // THÀNH CÔNG! — mutation cho phép
// person = {}; // LỖI: Assignment to constant variable
document.write(person.country); // England
</script>
Object.freeze() — Ngăn chặn mutation
<script>
const person = { name: 'Suresh', country: 'India' };
Object.freeze(person);
person.country = 'England'; // Thất bại (strict: TypeError)
document.write(person.country); // India — không đổi
</script>
Kết hợp cả hai: Best Practice
const CONFIG = Object.freeze({
API_URL: 'https://api.example.com',
TIMEOUT: 5000,
RETRIES: 3
});
// CONFIG không gán lại được (const)
// CONFIG.API_URL không sửa được (freeze)
Bảng so sánh
| Đặc điểm | const | Object.freeze() |
|---|---|---|
| Áp dụng cho | Variable binding | Object value |
| Ngăn gán lại biến | Có | Không |
| Ngăn mutation property | Không | Có (shallow) |
| Ngăn thêm/xóa property | Không | Có |
| Scope | Block scope | N/A (runtime) |
| Kế thừa | Không áp dụng | Không (shallow) |
Lưu ý
constvới primitive: giá trị thực sự bất biến (vì primitive immutable by nature).freeze()shallow — nested object vẫn mutable.- Trong non-strict mode, vi phạm freeze thất bại thầm; strict mode → TypeError.