Object.hasOwn 是 ES2022 引入的安全替代方法,用于准确判断对象自身是否拥有某属性而不查找原型链;它规避了 hasOwnProperty 在 null 原型对象或被覆盖时的错误,统一语法、支持 Symbol、返回布尔值且无副作用。

Object.hasOwn 是 ES2022 引入的静态方法,用来安全、直接地判断一个对象是否**自身拥有**某个属性(不查找原型链),它本质上是 hasOwnProperty 的更可靠替代品。
为什么需要 Object.hasOwn?——避开 hasOwnProperty 的陷阱
老写法 obj.hasOwnProperty(prop) 看似简单,但有两个常见隐患:
-
obj 可能没有继承自 Object.prototype:比如用
Object.create(null)创建的对象,本身就没有hasOwnProperty方法,直接调用会报错TypeError; -
obj 自身可能覆盖了 hasOwnProperty:如果对象自己定义了一个名为
hasOwnProperty的属性(比如{ hasOwnProperty: true }),那调用obj.hasOwnProperty('x')就会执行这个值(比如返回true而非布尔判断结果),完全失效。
Object.hasOwn 的正确用法
语法统一、无需担心对象状态:
Object.hasOwn(obj, 'propertyName') // 返回 true 或 false
```
它总是从 Object.prototype 上“借用”可靠的实现,不依赖 obj 自身是否有该方法或是否被污染。
- ✅ 安全用于
Object.create(null)对象; - ✅ 即使
obj.hasOwnProperty = 'hacked',也不受影响; - ✅ 支持 Symbol 类型键(和
hasOwnProperty一样); - ✅ 返回布尔值,语义清晰,无副作用。
对比示例:一眼看出差异
```jsconst nullProto = Object.create(null);
nullProto.foo = 'bar';
// ❌ 报错:Cannot read property 'hasOwnProperty' of null
// nullProto.hasOwnProperty('foo');
// ✅ 正常工作,返回 true
Object.hasOwn(nullProto, 'foo'); // true
const badObj = { hasOwnProperty: 'I am not a function!' };
badObj.x = 42;
// ❌ 返回字符串 'I am not a function!',不是布尔值,逻辑出错
// badObj.hasOwnProperty('x');
// ✅ 返回 true,行为始终可靠
Object.hasOwn(badObj, 'x'); // true
```
什么时候该用它?
只要你在做「检查对象自身是否定义了某属性」这件事,就优先用 Object.hasOwn:
- 遍历对象前判断 key 是否属于自身(避免误处理原型属性);
- 配置对象、用户输入对象等不可信来源的属性校验;
- 写工具函数(如深拷贝、序列化)时的安全属性访问;
- 替代所有
obj.hasOwnProperty的调用——现在已是推荐实践。


















