const只保证变量绑定的内存地址不可变,即“指针不可变”;对引用类型,其指向的堆内存内容仍可修改,故需object.freeze()等手段实现真正不可变。

const 本身不保证引用数据类型的不可变性,它只锁定变量绑定的内存地址,即“指针不可变”。对象或数组内部的属性、元素、结构依然可以自由修改。要真正实现引用类型的不可变性,需要额外手段。
为什么 const 对引用类型“失效”
const 声明后,变量名始终指向同一个内存地址:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 基本类型(如 number、string)值直接存于该地址 → 修改即报错
- 引用类型(如 object、array)该地址存的是指向堆内存的指针 → 指针没变,但堆里内容可改
例如:
const obj = { a: 1 };
obj.a = 2; // ✅ 允许 —— 修改属性
obj.b = 3; // ✅ 允许 —— 添加属性
obj = {}; // ❌ 报错 —— 试图换指针
手动实现引用类型不可变的常用方法
若需确保对象/数组内容也不变,可组合使用以下技术:
- Object.freeze():浅冻结,禁止增删改自有属性(但嵌套对象仍可变)
- Object.seal():封印,禁止增删属性,允许修改已有属性值
- Object.preventExtensions():禁止新增属性,其余操作不限
- 递归 freeze 或使用 Immutable.js / Immer 等库:应对深层嵌套场景
示例:
const obj = Object.freeze({ a: 1, nested: { x: 10 } });
obj.a = 99; // 静默失败(严格模式下报 TypeError)
obj.nested.x = 999; // ✅ 仍可改!因为 freeze 是浅层的
实际开发中的推荐做法
不要依赖 const 单独实现“真不可变”,而应按需分层控制:
- 声明用 const —— 防止意外重赋值,提升代码可读性和意图表达
- 数据初始化后立即 freeze(如配置对象、枚举字面量)
- 对复杂状态,优先选用不可变更新策略(如用扩展运算符创建新对象,而非修改原对象)
- 在 Redux、React 等场景中,配合 immer 等工具让“逻辑上不可变”更自然










