Object.hasOwn 是 ES2022 引入的安全替代方法,用于检测对象自有属性,避免 hasOwnProperty 被重写或缺失导致的错误,调用方式为 Object.hasOwn(obj, prop),现代环境已广泛支持。

Object.hasOwn 是 ES2022 引入的标准化方法,用来安全、简洁地检测对象是否拥有某个自有属性(即非继承属性),它正是为替代 obj.hasOwnProperty(prop) 而设计的。
为什么推荐用 Object.hasOwn?
传统 hasOwnProperty 有两大隐患:
- 对象可能重写了自身的
hasOwnProperty方法(比如{ hasOwnProperty: () => false }),导致检测失效; - 某些对象(如用
Object.create(null)创建的)根本没继承该方法,直接调用会报TypeError。
Object.hasOwn 绕过原型链,始终通过 Object.prototype.hasOwnProperty 的原始实现来判断,既安全又可靠。
基本用法对比
检测对象 user 是否有自有属性 "name":
// ❌ 旧写法(有风险)
user.hasOwnProperty('name')
<p>// ✅ 新写法(推荐)
Object.hasOwn(user, 'name')
参数顺序一致:第一个是目标对象,第二个是属性名(字符串或 Symbol)。
常见场景迁移示例
以下典型用法可直接替换:
- 遍历前过滤自有属性:
Object.keys(obj).filter(key => Object.hasOwn(obj, key))→ 实际上Object.keys本就只返回自有可枚举属性,但若配合for...in,则需显式过滤:for (const key in obj) { if (Object.hasOwn(obj, key)) { /* 处理 */ } } - 配置对象校验:
if (!Object.hasOwn(config, 'timeout')) config.timeout = 5000 - 解构前兜底:
const { id, name } = data; const isValid = Object.hasOwn(data, 'id') && Object.hasOwn(data, 'name');
兼容性与降级建议
现代浏览器和 Node.js 16.9+ 均已支持。若需兼容旧环境:
- 使用 Babel +
@babel/preset-env自动按需注入 polyfill; - 手动降级(不推荐长期使用):
Object.hasOwn ??= Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
注意:不要写成 Object.hasOwn = Object.prototype.hasOwnProperty —— 这会丢失 this 绑定,必须用 call.bind 或箭头函数封装。

















