為什麼可以修改使用const宣告的陣列(或物件)的內容?

原始問題

const宣告一個陣列(或物件),為何可以在宣告完畢後繼續修改該陣列(或物件)的內容?

事實上const的限制是「變數不能被re-assigned或re-declared」

簡答

const的限制是「只能賦值一次,不能重新賦值」,不直接等同「不能修改內容」。

環境

Google Chrome: 89.0.4389.114 (Official Build) (64-bit)
os: Windows_NT 10.0.18363 win32 x64

關於const的事實

You Don’t Know JS Yet 相關筆記

ES2015 const is not about immutability 相關筆記

MDN 上的相關內容

Object.freeze()

Object.seal()

Object.preventExtensions()

Object.preventExtensions()只會禁止對物件新增內容,但可以刪除或修改既有內容

Object.freeze() demo 4

Object.getOwnPropertyDescriptor()

回傳一物件中某內容的相關設定

Object.freeze() demo 5

參考ECMAScript Specification, Table 3: Attributes of a Data Property

補充:無法解凍或再開封

Opposite of Object.freeze or Object.seal in JavaScript

Freezing an object is the ultimate form of lock-down. Once an object has been frozen it cannot be unfrozen – nor can it be tampered in any manner. This is the best way to make sure that your objects will stay exactly as you left them, indefinitely

參考文件