object.hasown是es2022引入的安全检测对象自身属性的方法,替代冗长且易受原型污染影响的object.prototype.hasownproperty.call,支持object.create(null)对象,现代浏览器及node.js v16.9+已原生支持。

Object.hasOwn 是 ES2022 引入的原生方法,专为安全、简洁地检测对象自身属性而设计,直接替代了过去常用的 Object.prototype.hasOwnProperty.call(obj, key) 写法。
为什么需要替代?
传统写法存在两个主要问题:一是冗长难读;二是当目标对象的原型链上重写了 hasOwnProperty(比如某些库或恶意代码),或对象本身没有原型(Object.create(null)),obj.hasOwnProperty(key) 会失效甚至报错,必须借助 call 绕过。而 Object.hasOwn 内部不依赖对象自身的 hasOwnProperty 方法,始终从 Object.prototype 安全调用,天然规避这些问题。
基本用法对比
以下两种写法功能完全等价,但后者更直观可靠:
- ✅ 推荐:
Object.hasOwn(obj, 'prop') - ❌ 过去惯用:
Object.prototype.hasOwnProperty.call(obj, 'prop')
例如:
const obj = { a: 1 };Object.hasOwn(obj, 'a'); // true
Object.hasOwn(obj, 'toString'); // false(不是自身属性)
Object.hasOwn(Object.create({ b: 2 }), 'b'); // false(继承而来)
特别适合这些场景
- 检查
Object.create(null)创建的对象(它没有hasOwnProperty方法,传统方式会报错) - 遍历对象前快速过滤掉继承属性,配合
for...in使用更安心 - 在 TypeScript 或严格模式下减少类型断言或
//@ts-ignore注释 - 提升可读性——一眼看懂意图,无需理解
call的上下文绑定逻辑
兼容性注意
目前主流现代浏览器和 Node.js(v16.9+)均已支持。如需兼容旧环境(如 IE 或早期 Node),可用 polyfill:
if (!Object.hasOwn) {Object.hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
}
该 polyfill 行为与原生一致,且比每次手写 call 更轻量。











