Object.hasOwn 是 ES2022 引入的静态方法,彻底绕过原型链污染与覆盖风险,支持 Object.create(null) 对象、对 null/undefined 返回 false,语义清晰且现代环境广泛支持。

Object.hasOwn 是 ES2022 正式引入的静态方法,它不是 hasOwnProperty 的简单语法糖,而是从底层设计上解决了后者长期存在的几类可靠性问题。在现代开发中,它已成属性存在性检查的推荐方式。
不依赖原型链,彻底避开覆盖风险
hasOwnProperty 是挂载在 Object.prototype 上的实例方法,所有普通对象靠继承使用它。但一旦对象自身定义了同名属性(比如 { hasOwnProperty: null } 或 { hasOwnProperty: () => false }),调用就会报错或返回错误结果。
Object.hasOwn 是静态方法,直接通过 Object.hasOwn(obj, key) 调用,完全绕过目标对象的原型和自身属性。即使对象是 Object.create(null) 创建的(没有原型),也能安全运行。
对 null 和 undefined 天然友好
对 null 或 undefined 调用 obj.hasOwnProperty('key') 会立即抛出 TypeError;而 Object.hasOwn(null, 'key') 和 Object.hasOwn(undefined, 'key') 稳定返回 false,符合“不存在即为 false”的直觉逻辑。
立即学习“Java免费学习笔记(深入)”;
- 省去常见兜底写法:obj && obj.hasOwnProperty && obj.hasOwnProperty(key)
- 避免因漏判空导致运行时崩溃,尤其在处理 API 响应、可选参数等场景更鲁棒
语义清晰,调用更直观
hasOwnProperty 的调用主体是对象本身,容易让人误以为“这是该对象的能力”,但实际上它的行为取决于原型链状态,存在语义误导。
Object.hasOwn(obj, key) 明确表达“我让 Object 来检查这个 obj”,主谓宾清晰:
- 参数顺序与 Object.keys、Object.values 一致,降低认知负担
- 无需记忆 Object.prototype.hasOwnProperty.call(obj, key) 这种冗长写法
- 不触发对象上可能存在的 getter,也不因键名类型转换出错
现代环境支持良好,降级成本低
Chrome 93+、Firefox 92+、Safari 15.4+、Edge 93+ 和 Node.js 16.9+ 均原生支持。
旧环境可通过轻量 polyfill 安全降级:
if (!Object.hasOwn) {Object.hasOwn = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
}
构建工具(如 Babel 配合 @babel/preset-env)可按目标浏览器自动转换;TypeScript 项目只需确保 lib 包含 es2022 即可获得完整类型提示。


















