object.hasown 是检测对象自有属性的推荐方法,它比 in 操作符更精确(不检查原型链)、比 hasownproperty 更可靠(不依赖对象自身方法),支持字符串和 symbol 键,es2022 原生支持,旧环境可用 polyfill 降级。

Object.hasOwn 是 JavaScript 中推荐用来安全检测对象自身属性的方法,它比 hasOwnProperty 更可靠,也比 in 操作符更精确。
为什么用 Object.hasOwn 而不是 in 或 hasOwnProperty?
in 会检查原型链上的属性,不区分“自有”还是“继承”;obj.hasOwnProperty(prop) 在对象自身重写了 hasOwnProperty 方法时会失效(比如 { hasOwnProperty: null });而 Object.hasOwn(obj, prop) 是静态方法,不依赖对象自身的任何方法,完全绕过原型干扰,更健壮。
基本用法:传入对象和属性名字符串
语法很简单,接收两个参数:目标对象和要检测的属性键(字符串或 Symbol)。
- 支持字符串属性名:
Object.hasOwn(obj, 'name') - 支持 Symbol 属性名:
Object.hasOwn(obj, Symbol('id')) - 属性名会被自动转为字符串(非字符串非 Symbol 会调用
toString(),但一般建议传原始类型)
常见使用场景和注意事项
适合在不确定对象来源(如用户输入、第三方数据)时做安全判断。
- 避免直接调用
obj.hasOwnProperty—— 如果 obj 是{ hasOwnProperty: false },就会报错或返回错误结果 - 与解构默认值配合:比如
const { name } = obj; if (!Object.hasOwn(obj, 'name')) { /* 处理缺失 */ } - 遍历前校验:在
for...in循环中配合使用,确保只处理自有属性(虽然通常更推荐Object.keys())
兼容性与降级方案
Object.hasOwn 自 ES2022(Node.js 16.9+、Chrome 93+、Firefox 92+)起原生支持。旧环境可用 polyfill:
如果需兼容较老运行时,可这样安全降级:
const hasOwn = Object.hasOwn || Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
注意不要直接赋值 Object.hasOwn = ...,避免污染全局;建议局部定义或使用工具库(如 core-js)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











