const声明引用类型变量时变量绑定不可重新赋值,但其内部属性或元素仍可修改;真正冻结需用object.freeze()实现浅冻结,深层冻结需递归处理。

用 const 声明引用类型变量(如对象、数组)时,**变量绑定不可重新赋值,但其内部属性或元素仍可修改**。这不是“完全只读”,而是“只读引用”。
const 对引用类型的限制:禁止重新赋值
const 保证的是变量标识符始终指向同一个内存地址,不能用 = 再赋一个新对象或新数组。
- ✅ 允许:
obj.name = "Alice"、arr.push(4)、obj.items[0] = "changed" - ❌ 不允许:
obj = {}、arr = [1,2]、obj = Object.assign({}, obj)
想真正冻结对象?用 Object.freeze()
Object.freeze() 可阻止添加、删除、修改自有属性(浅冻结),配合 const 更安全:
const user = Object.freeze({
name: "Bob",
age: 30
});
user.name = "Tom"; // 无效(严格模式下报错)
user.job = "Engineer"; // 无效
// user 仍为原对象,但不可变
⚠️ 注意:它只冻结第一层属性。若 user.profile = { city: "NYC" },则 user.profile.city 仍可改 —— 需递归 freeze 或用 Object.seal() + 手动控制。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
数组也一样:const 阻止重赋值,不限制内容变更
声明为 const list = [1, 2, 3]; 后:
- ✅
list.push(4)、list[0] = 99、list.splice(1,1)都合法 - ❌
list = [5,6]、list = new Array(3)会报错Assignment to constant variable
如需不可变数组,可用 Object.freeze(list),或使用函数式方法返回新数组(如 [...list, 4]),避免副作用。
常见误区提醒
很多人误以为 const obj = {}; 就是“常量对象”。其实它只是“常量引用”。关键要分清:
- 引用不可变 → 地址锁死,不能指向别处
-
值不可变 → 需额外手段(
freeze、不可变库、或约定只读访问)
实际开发中,建议:声明用 const,意图用注释或 TypeScript 类型标注补充,深层不可变需求优先考虑 Object.freeze 或专门的不可变数据结构(如 Immutable.js 或现代 Proxy 方案)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










