const声明的对象引用不可变、内容可变;它仅固定变量名与内存地址的绑定,允许修改属性、增删字段及嵌套内容,但禁止重新赋值;如需禁止修改需用Object.freeze()实现浅冻结。

const 声明的对象“引用不可变,内容可变”,这是理解它的核心。它不冻结对象本身,只锁住变量名和内存地址之间的绑定关系。
const 锁的是“指向”,不是“内容”
当你写 const obj = { name: 'Alice' };,JavaScript 做了两件事:
- 在堆内存中创建一个对象,比如地址 0x1a2b
- 把标识符 obj 绑定到这个地址,且这个绑定关系永久固定
之后你不能让 obj 指向另一个地址(比如 obj = {}),但完全可以在 0x1a2b 这个位置上增删改属性。
哪些操作是允许的?
只要不改变 obj 的指向,以下全部合法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 修改已有属性:obj.name = 'Bob'
- 添加新属性:obj.age = 30
- 删除属性:delete obj.name
- 修改嵌套对象或数组:obj.profile.city = 'Shanghai' 或 obj.tags.push('JS')
哪些操作会报错?
这些操作试图打破“绑定不可变”规则,运行时直接抛出 TypeError:
- 重新赋值整个变量:obj = { id: 2 }
- 声明时不初始化:const obj;(语法错误)
- 在暂时性死区中访问:console.log(obj) 出现在 const obj = ... 之前
想真正禁止修改,得用 Object.freeze()
Object.freeze() 是专门用来冻结对象自有属性的工具,但它只做浅冻结:
- 第一层属性不能增、删、改(严格模式下赋值会静默失败或报错)
- 嵌套对象仍可修改:const frozen = Object.freeze({ user: { name: 'Tom' } }); frozen.user.name = 'Jerry'; // 有效
- 如需深冻结,需手动递归调用或借助库

















