•2 min read

const và tính bất biến trong JavaScript: Bất biến ở “biến” chứ không phải “giá trị”

const và tính bất biến trong JavaScript: Bất biến ở “biến” chứ không phải “giá trị”
Audio Briefing
0:00 / 0:00
Sự thật chỉ đúng một nửa

"const không phải bất biến, vì bạn vẫn có thể thay đổi object." Câu nói này thường chỉ đúng một nửa, và đó là lý do khiến nhiều người mới lập trình bị dẫn dắt sai!

const trong JavaScript không đóng băng giá trị của bạn. Nó đóng băng liên kết biến (variable binding)—tức là bạn không thể gán biến đó sang một giá trị khác hoàn toàn.

Gán lại (Thất bại)

const x = 5;
x = 10; // ❌ TypeError

Lỗi vì x là một hằng. Bạn không thể "chỉ" nó sang chỗ khác.

Đột biến / Thay đổi (Thành công)

const user = { name: "Ava" };
user.name = "Morgan"; // ✅ Chạy được!

Bạn không gán lại user; bạn chỉ đang sửa nội dung của object mà nó trỏ tới.

Mảng cũng hoạt động y như vậy

const items = [1, 2, 3];
items.push(4); // ✅ Chạy được!
items = [];    // ❌ TypeError
Mô hình tư duy đúng

Hãy nhớ rằng: Binding giữ nguyên, nhưng giá trị bên trong vẫn có thể thay đổi. JavaScript xử lý theo ngữ nghĩa ngôn ngữ, không phải địa chỉ bộ nhớ thô!

Nếu bạn thật sự muốn bất biến (Immutability)

Nếu mục tiêu của bạn là không ai được phép thay đổi object, thì const chưa đủ. Bạn cần tự ép buộc tính bất biến.

Dùng Object.freeze()
const user = Object.freeze({ name: "Ava" });
user.name = "Morgan"; // ❌ TypeError (trong strict mode)

Lưu ý: Object.freeze chỉ đóng băng nông (shallow). Các object lồng bên trong vẫn bị thay đổi trừ khi bạn đóng băng luôn chúng!

Tóm lại, const không phải là bất biến sâu (deep immutability). Nó chỉ cấm việc gán lại. Hãy tự tin dùng nó cho các liên kết cố định, nhưng nhớ rằng đối tượng bên trong vẫn "mở cửa" cho sự thay đổi!

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement