Object.hasOwn 是 ES2022 引入的安全高效方法,仅检查对象自身属性、跳过原型链,避免遍历开销与 hasOwnProperty 被篡改风险,推荐替代 'prop' in obj 和 obj.hasOwnProperty('prop')。
Object.hasOwn 是 ES2022 引入的原生方法,用于直接判断对象自身是否拥有某个属性(不查找原型链),它比 in 操作符和 hasOwnProperty 更安全、更明确,能有效避免原型链遍历带来的性能开销和潜在陷阱。
当使用 'prop' in obj 或 obj.hasOwnProperty('prop') 时,JavaScript 引擎会从 obj 开始,逐级向上遍历原型链,直到找到该属性或到达 null。即使属性就在对象自身上,引擎仍需确认“没在原型上被遮蔽”,这个过程在高频操作(如循环、渲染逻辑)中会累积可观开销。更严重的是,如果原型链上有同名属性,或者对象重写了 hasOwnProperty 方法,结果可能出人意料。
Object.hasOwn 只检查对象自身的属性,完全跳过原型链,且不受 Object.prototype 上属性或方法篡改的影响:
以下常见模式建议统一迁移到 Object.hasOwn:
'name' in user → Object.hasOwn(user, 'name')
user.hasOwnProperty('age') → Object.hasOwn(user, 'age')
if (Object.hasOwn(data, 'id') && typeof data.id === 'string')
Object.hasOwn 接受任意类型作为第一个参数,但只有普通对象、数组、函数等有属性的对象才返回有意义结果:
obj != null && Object.hasOwn(obj, key))