Object.freeze仅浅冻结对象,添加/删除属性、修改值或重定义描述符均失效,但嵌套对象内部仍可修改;可用Object.isFrozen检测,适用于配置常量等场景。

Object.freeze 能让对象变成“只读”状态,但要注意它只做浅冻结——即只冻结对象自身属性,不递归冻结嵌套对象。
冻结后哪些操作会失效
调用 Object.freeze(obj) 后,以下行为将被静默忽略(非严格模式)或抛出错误(严格模式):
- 添加新属性(
obj.newProp = 1) - 删除已有属性(
delete obj.prop) - 修改现有属性值(
obj.prop = 2) - 重定义属性描述符(
Object.defineProperty(obj, 'prop', {...}))
冻结是浅层的,嵌套对象仍可修改
如果对象里有子对象,子对象本身不会被冻结:
const user = {
name: 'Alice',
address: { city: 'Beijing' }
};
Object.freeze(user);
user.name = 'Bob'; // ❌ 无效
user.address.city = 'Shanghai'; // ✅ 仍然可以改!
需要深度冻结时,得手动递归处理,或借助第三方库(如 deep-freeze),或用 JSON.parse(JSON.stringify(obj)) 创建不可变副本(仅适用于纯数据,不支持函数、undefined、Date 等)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
检查对象是否已被冻结
可用 Object.isFrozen(obj) 判断:
console.log(Object.isFrozen(user)); // true console.log(Object.isFrozen(user.address)); // false
注意:即使对象是空对象或已冻结,Object.freeze 多次调用也安全,返回原对象。
适用场景和注意事项
- 适合配置对象、常量枚举、初始状态快照等不希望被意外修改的数据
- 不能阻止对数组元素的修改(如
arr[0] = 99),但能阻止数组长度变更(push、pop等会失败) - 冻结后 Object.keys、for...in 等仍可正常遍历,不影响读取
- 冻结不等于密封(Object.seal 允许改值但不允许增删属性),也不等于不可扩展(Object.preventExtensions 只禁新增)

















