object.hasown 可安全判断 object.create(null) 对象的自有属性,因其不依赖原型链上的 hasownproperty 方法;object.create(null) 创建的对象原型为 null,故无 hasownproperty 等继承方法,直接调用会报错。

Object.hasOwn 可以安全判断 Object.create(null) 创建的对象是否拥有某个自有属性,它不依赖原型链上的 hasOwnProperty 方法,因此能绕过因原型为空导致的“方法丢失”问题。
为什么 Object.create(null) 的对象没有 hasOwnProperty
Object.create(null) 创建的对象原型为 null,不继承自 Object.prototype,所以没有 hasOwnProperty、toString、isPrototypeOf 等常规方法。直接调用 obj.hasOwnProperty('key') 会报错 TypeError。
Object.hasOwn 是专为此类场景设计的替代方案
Object.hasOwn(obj, prop) 是 ES2022 引入的静态方法,它不通过对象原型查找,而是直接检查对象自身的属性(包括不可枚举属性),完全避开原型链依赖。对 Object.create(null) 对象完全兼容。
- ✅ 安全:不会因原型为空而报错
- ✅ 准确:只检测自有属性,行为等价于
Object.prototype.hasOwnProperty.call(obj, prop),但更简洁 - ✅ 标准:已成 ECMAScript 正式特性,现代环境普遍支持(Node.js ≥16.9,Chrome ≥93,Firefox ≥91 等)
实际使用对比示例
假设你用 Object.create(null) 实现一个轻量配置映射:
const config = Object.create(null); config.timeout = 5000; config.retry = true;
错误写法(会崩溃):
if (config.hasOwnProperty('timeout')) { ... } // TypeError: config.hasOwnProperty is not a function
正确写法:
if (Object.hasOwn(config, 'timeout')) { ... } // ✅ 返回 true
也可用于遍历前的安全判断:
for (const key of Object.keys(config)) {
if (Object.hasOwn(config, key)) {
console.log(key, config[key]);
}
}
兼容性补充与降级建议
若需支持老旧环境(如 Node.js
const hasOwn = Object.hasOwn || Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
或更明确地封装:
function hasOwnProp(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
// 使用:hasOwnProp(config, 'timeout')
注意:不要用 prop in obj 替代,因为它会查找原型链,对 Object.create(null) 虽无报错但逻辑不同(此时原型为 null,in 表达式表现类似 hasOwn,但语义不一致,且无法区分继承属性)。











