Javascript const排解

這是一個常見又很重要的 JavaScript 問題:


❓為什麼用 const 宣告的物件可以 push

1
2
3
const arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1, 2, 3, 4] ✅

✅ 答案:因為 const 限制的是 變數的參考(reference)不可重新指定不是內容不可改變!


🔍 詳細說明:

  • 在 JavaScript 中,物件(Object)與陣列(Array)是「參考型別(reference type)」。
  • const 宣告的是「變數的參考地址不能變動」,但這個地址裡的內容(物件屬性、陣列元素)是可以改的

✅ 可做的事:

可以修改物件/陣列的內容

1
2
3
4
5
6
const obj = { a: 1 };
obj.a = 2; // ✅ 可以改屬性
obj.b = 3; // ✅ 可以新增屬性

const arr = [1, 2];
arr.push(3); // ✅ 可以修改內容(但不是變數本身)

❌ 不可做的事:

不能把這個變數重新指向其他物件或值

1
2
3
4
5
const obj = { a: 1 };
obj = { b: 2 }; // ❌ TypeError:不能重新指派 const 變數

const arr = [1, 2];
arr = [3, 4]; // ❌ 同上,不能改 reference

🧠 小結

類型 可以改內容? 可以重新指定變數?
const 物件 ✅ 可以 ❌ 不行
let 物件 ✅ 可以 ✅ 可以
var 物件 ✅ 可以 ✅ 可以

📌 延伸說明(常見誤解)

❗誤解:「const 宣告就是不可變的變數」

錯。const 宣告的變數是不可被重新賦值,但如果變數是物件或陣列,其內容仍可修改。

如果你想讓整個物件內容都不能變動,可以使用:

1
2
3
const obj = Object.freeze({ a: 1 });
obj.a = 2; // 不會報錯,但不會改成功(嚴格模式下會報錯)
console.log(obj.a); // 1