const仅防止变量重新赋值,Object.freeze()实现浅层只读;两者结合可达成引用与值均不可变,但嵌套对象需递归冻结,且Object.isFrozen()对原始值恒返回false。

在 JavaScript 中,const 只能防止变量**重新赋值**,但无法阻止对象内部属性被修改。要实现“真正的常量不可变”,必须配合 Object.freeze() —— 它能冻结对象自身属性(禁止添加、删除、修改),让对象进入浅层只读状态。
const + Object.freeze 的作用分工
const 锁住引用地址,Object.freeze() 锁住对象内容。两者结合,才能从“引用不可变”升级为“值不可变”:
-
const obj = { a: 1 };→ 允许obj.a = 2或obj.b = 3 -
const obj = Object.freeze({ a: 1 });→obj.a = 2失败(严格模式报错,非严格模式静默失败),obj.b = 3也无效
注意:Object.freeze 是浅冻结
它只冻结对象**第一层属性**,嵌套对象仍可被修改:
const config = Object.freeze({
version: '1.0',
features: { darkMode: true, animations: false }
});
config.version = '2.0'; // ❌ 失败
config.features.darkMode = false; // ✅ 成功!
如需深层冻结,需递归调用 Object.freeze(或使用第三方库如 deep-freeze),但要注意循环引用问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
冻结后如何验证是否生效
可用 Object.isFrozen() 检查:
const user = Object.freeze({ name: 'Alice' });
console.log(Object.isFrozen(user)); // true
console.log(Object.isFrozen(user.name)); // false(字符串是原始值,本身不可变)
注意:Object.isFrozen() 对原始值(如字符串、数字)返回 false,这是正常行为,因为它们天生不可变。
实用建议与常见误区
以下写法更安全、清晰:
- 冻结操作应紧接对象字面量创建之后,避免中间被修改:
const API_CONFIG = Object.freeze({ baseUrl: 'https://api.example.com' }); - 不要对已存在的可变对象后期冻结并期望“回溯保护”——冻结前的修改已发生
- 类数组对象、Map/Set 等不能直接用
Object.freeze冻结(它们不是普通对象),需封装或转为普通对象再冻结 - 在 TypeScript 中,配合
as const可获得更严格的类型推导(如{ x: 1 } as const推出{ readonly x: 1 }),但运行时仍需Object.freeze保障

















