const声明的数组变量不可重新赋值,但其元素、长度等内部属性可修改;若需完全不可变,须用object.freeze()进行浅冻结,深冻结需递归处理。

const 声明的数组本身不可重新赋值,但数组元素默认是可变的——这是 JavaScript 中常被误解的关键点。用 const 声明数组,只是禁止把该变量名指向另一个新数组(或其它值),并不冻结数组内容。
为什么 const 数组的元素还能改?
因为 const 约束的是“绑定”(binding),不是“值”。数组是引用类型,const arr = [1, 2]; 表示变量 arr 永远指向这个数组对象;但该对象内部的元素、长度、属性仍可修改。
-
arr.push(3)✅ 允许(修改原数组) -
arr[0] = 99✅ 允许(直接改索引项) -
arr.length = 0✅ 允许(清空数组) -
arr = [4, 5]❌ 报错(试图重新赋值变量)
如何真正让数组元素也不可变?
若需完全冻结数组及其所有元素(包括嵌套对象),需用 Object.freeze():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arr = Object.freeze([1, 2, {x: 3}]);- 此时
arr.push(4)、arr[0] = 9都静默失败(严格模式下会报错) - ⚠️ 注意:
Object.freeze()是浅冻结——arr[2].x = 99仍会成功。如需深冻结,需手动递归或使用第三方库
常见误用提醒
别混淆「声明时赋值」和「运行时保护」:
-
const arr = []; arr = [1];→ 报错(重赋值) -
const arr = []; arr.push(1);→ 正常(修改内容) -
const arr = Object.freeze([]); arr.push(1);→ 无效(冻结后无法增删改)
想用 const 声明数组又保持灵活性,就放心操作元素;真要不可变,才加 Object.freeze。不复杂但容易忽略本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










