const限制的是变量绑定(内存地址)不可变,而非对象内容不可变;对象是引用类型,存储在堆中,只要不重新赋值变量,修改、新增、删除属性或调用改变自身的方法均合法;真正冻结需用object.freeze()实现浅冻结。

const 声明的对象本身不能重新赋值,但对象的属性可以修改——因为 const 限制的是变量绑定(即内存地址)不可变,而不是对象内容不可变。
为什么能改属性?
JavaScript 中,const 保证的是“变量标识符始终指向同一个内存地址”,而对象是引用类型,存储在堆中。只要不把变量重新指向另一个对象(比如 obj = {}),就符合 const 规则。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const user = { name: 'Alice' };
user.name = 'Bob'; // ✅ 允许:修改属性
user.age = 30; // ✅ 允许:新增属性
user = { name: 'Charlie' }; // ❌ 报错:试图重新赋值
哪些操作是安全的?
- 给已有属性赋新值:
obj.prop = newValue - 添加新属性:
obj.newKey = value - 删除属性:
delete obj.prop - 调用会改变自身的方法:
arr.push()、map.set()、obj.someMethod()(前提是方法内部修改的是对象自身)
如何真正冻结对象?
如果希望连属性也不被修改,需要用 Object.freeze():
const user = Object.freeze({ name: 'Alice' });
user.name = 'Bob'; // ❌ 无效(严格模式下会报错)
user.age = 30; // ❌ 无效
注意:Object.freeze() 是浅冻结,嵌套对象仍可修改;如需深冻结,需手动递归或借助第三方库。
常见误区提醒
-
const不等于“常量对象”,它只是“常量引用” - 数组也一样:
const arr = [1,2]; arr.push(3)合法,arr = [4,5]非法 - 函数、日期、正则等引用类型同理,
const只锁住变量名指向的位置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










