object.freeze仅浅冻结对象自身属性,不能冻结变量绑定或嵌套对象;它阻止增删改自有属性及修改原型,但不作用于原型链、不可逆,且需手动递归实现深冻结。

Object.freeze 不能冻结变量本身,只能冻结对象的属性,让它不可添加、删除、修改,但变量仍可重新赋值。
冻结对象属性,但不阻止变量重新赋值
JavaScript 中的 const 只保证变量绑定不可变,Object.freeze 则作用于对象内部结构。两者配合使用效果更佳:
-
const obj = Object.freeze({ name: "Alice" });—— 此时obj.name = "Bob"无效(严格模式下报错,非严格模式静默失败) - 但
obj = { name: "Charlie" };依然会报错(因为是const声明),如果用let obj = ...,这行赋值就完全合法
只冻结一层,嵌套对象不受保护
Object.freeze 是浅冻结,对嵌套对象、数组等内部结构不起作用:
const data = Object.freeze({ user: { age: 30 } });-
data.user.age = 31;—— ✅ 依然能改 - 如需深冻结,需递归调用
Object.freeze,或借助第三方库(如deep-freeze),但注意性能和循环引用风险
冻结后检查是否生效
可用 Object.isFrozen() 验证对象是否已被冻结:
console.log(Object.isFrozen(data)); // true- 注意:即使对象被冻结,
Object.keys()、for...in等仍可正常遍历已有属性 - 冻结不影响 getter/setter 的行为,但无法新增或重定义它们
适用场景与注意事项
常用于配置对象、常量枚举、状态初始值等需要确保结构稳定的场合:
- 避免意外修改共享配置:
const CONFIG = Object.freeze({ API_URL: "/api" }); - 冻结前建议先用
Object.preventExtensions()和Object.seal()理解差异:freeze 最严格,seal 允许改值但不允许增删属性,preventExtensions 仅禁止新增 - 冻结对原始值(string、number、boolean)无效,因为它们本身不可变;只对对象、数组、函数等引用类型有意义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











