const声明的数组变量不可重新赋值但元素可修改,因其限制的是变量绑定而非内容;可用push/pop/splice等方法增删元素,禁止直接赋值新数组;需冻结内容时可用Object.freeze()实现浅冻结。

const 声明的数组本身不可重新赋值,但数组内容(元素)可以修改。也就是说,你不能把变量指向另一个新数组,但可以调用 push()、pop()、splice() 等方法改变原数组的元素。
为什么 const 数组能增删元素?
因为 const 限制的是“绑定不可变”——即变量名不能再次指向其他内存地址,而不是数组内容不可变。数组是引用类型,const arr = [] 表示 arr 这个名字始终指向同一块堆内存,而对该内存中数据的操作是完全允许的。
常用且安全的增删操作方式
-
添加元素:用
push()(尾部)、unshift()(头部)、splice()(任意位置) -
删除元素:用
pop()(尾部)、shift()(头部)、splice()(指定位置)、filter()(返回新数组,不改变原数组) -
替换/修改元素:直接通过索引赋值,如
arr[0] = 'new'
哪些操作是禁止的?
以下写法会报错(TypeError: Assignment to constant variable):
-
arr = [1, 2, 3]—— 试图把arr指向一个新数组 -
arr = [...arr, 4]或arr = arr.concat(4)—— 同样是重新赋值
如果想真正“冻结”数组内容怎么办?
可以用 Object.freeze() 防止增删改,但注意它只做浅冻结:
立即学习“Java免费学习笔记(深入)”;
const arr = Object.freeze([1, 2, 3]);<br>arr.push(4); // 无效,静默失败(严格模式下报错)<br>arr[0] = 99; // 无效<br>
若数组含对象,对象内部仍可修改,需递归冻结或使用 structuredClone + 冻结配合处理。


















