object.freeze()仅浅冻结对象,使顶层属性不可添加、删除、修改或重配置,但嵌套对象仍可变;可用object.isfrozen()检测,常与const配合实现完全不可变。

JavaScript 中使用 Object.freeze() 可以冻结对象,使其属性不可添加、删除或修改(包括值和属性描述符),但注意它只做浅冻结。
基本用法:冻结简单对象
调用 Object.freeze(obj) 后,对象变为不可变:
- 无法修改已有属性的值
- 无法添加新属性
- 无法删除已有属性
- 无法重新配置属性(如改为可写、可枚举等)
示例:
const user = { name: 'Alice', age: 30 };
Object.freeze(user);
user.name = 'Bob'; // 无效(非严格模式静默失败;严格模式报 TypeError)
user.city = 'Beijing'; // 无效
delete user.age; // 无效
冻结后如何检测是否被冻结
可用 Object.isFrozen() 判断:
console.log(Object.isFrozen(user)); // true
注意:该方法只检查对象自身是否冻结,不递归检查嵌套对象。
浅冻结的限制:嵌套对象仍可变
Object.freeze() 不会递归冻结嵌套对象,内部对象属性仍可修改:
const config = {
server: { host: 'localhost', port: 3000 },
debug: true
};
Object.freeze(config);
config.debug = false; // ❌ 失败(顶层冻结)
config.server.port = 8080; // ✅ 成功(server 对象未冻结)
若需深冻结,需手动递归处理(或借助库如 deep-freeze),例如:
function deepFreeze(obj) {
Object.getOwnPropertyNames(obj).forEach(prop => {
if (obj[prop] !== null && typeof obj[prop] === 'object') {
deepFreeze(obj[prop]);
}
});
return Object.freeze(obj);
}
与 const 的区别
const 只防止变量重新赋值,不阻止对象内部修改;Object.freeze() 阻止对象内容变更:
const obj = { a: 1 };
obj = { b: 2 }; // ❌ 报错:Assignment to constant variable
obj.a = 2; // ✅ 允许(除非已 freeze)
Object.freeze(obj);
obj.a = 3; // ❌ 失败
二者常配合使用:用 const 锁定引用,用 Object.freeze() 锁定内容。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











