object.hasown 在冻结对象上完全可用且行为一致,它只判断属性是否存在于对象自身,不读取值、不修改状态,不受 object.freeze 影响;相比 hasownproperty,它更可靠,因是静态方法,不依赖原型链,支持 object.create(null) 等场景。

Object.hasOwn 在处理冻结对象时完全不受影响,能正常工作。
它不修改对象,只做属性存在性判断
Object.hasOwn 是一个纯查询方法,既不读取属性值,也不尝试写入或改变对象状态。所以无论对象是否被 Object.freeze() 冻结,只要属性存在于该对象自身(非继承),它就返回 true。
- 冻结后添加新属性会被忽略 → hasOwn 对新属性自然返回 false
- 冻结后删除已有属性被禁止 → 原有自有属性依然存在 → hasOwn 仍返回 true
- 冻结后修改属性值被禁止 → 但属性本身还在 → hasOwn 判定结果不变
比 hasOwnProperty 更稳妥地支持冻结对象
虽然 Object.prototype.hasOwnProperty 也能在冻结对象上运行,但它依赖对象原型链上的方法。如果对象是 Object.create(null) 创建的(常用于配置对象、Map-like 结构),或者 hasOwnProperty 被意外覆盖,就会出错。
- Object.hasOwn 是静态方法,不依赖实例原型
- 即使对象被 freeze + create(null),hasOwn 依然可用
- 例如:
const cfg = Object.freeze(Object.create(null)); cfg.test = 1;—— 这行赋值无效,cfg 仍是空对象,Object.hasOwn(cfg, 'test')返回 false
实际使用中无需额外适配
你不需要为冻结对象单独写分支逻辑。只要用法正确,hasOwn 的行为和普通对象一致:
const obj = Object.freeze({ a: 1 }); Object.hasOwn(obj, 'a') // trueObject.hasOwn(obj, 'b') // falseobj.a = 2; // 无效,但不影响 hasOwn 判定Object.hasOwn(obj, 'a') // 仍是 true
注意:冻结不影响属性“存在性”,只影响“可变性”
冻结对象的本质是让属性描述符变为 { writable: false, configurable: false },但 enumerable 和 value 不变,属性依然属于对象自身。hasOwn 正是检查这个“归属关系”,不是检查“能否修改”。
- 所以它和 Object.isFrozen、Object.getOwnPropertyDescriptor 等方法关注的是不同维度
- 你可以放心把 hasOwn 当作“是否存在自有属性”的标准答案,不管对象是否冻结











