hasOwnProperty 不触发 getter,仅检测自有属性存在性;易与 obj.prop、Reflect.get(触发 getter)及 in 操作符(查原型链)混淆;Object.hasOwn 是更安全的现代替代方案。

不会触发 getter。
hasOwnProperty 只检查属性是否存在,不读取值
Object.prototype.hasOwnProperty() 是一个纯粹的“存在性检测”方法。它只查看对象内部的属性键列表(即自有属性名),完全不访问属性值,因此无论该属性是数据属性还是带 getter 的访问器属性,都不会执行 getter 函数。
例如:
const obj = {
data: 42,
get risky() {
console.log('getter 被调用了!'); // 这行永远不会因 hasOwnProperty 而执行
return Math.random();
}
};
obj.hasOwnProperty('data'); // true,无副作用<br>
obj.hasOwnProperty('risky'); // true,但 console.log 不会输出<br>
obj.hasOwnProperty('missing'); // false
和哪些操作容易混淆?
-
obj.prop或obj['prop']:会触发 getter(如果定义了) -
Reflect.get(obj, 'prop'):也会触发 getter(receiver 参数只改 this,不跳过执行) -
prop in obj:不触发 getter,但会查原型链,无法区分自有/继承 -
Object.hasOwn(obj, 'prop'):现代推荐方式,行为同 hasOwnProperty,但更安全(防覆盖、支持 Symbol、对非对象报错)
什么情况下 hasOwnProperty 可能“失效”?
它本身逻辑稳定,但实际使用中要注意:
- 对象原型上重写了
hasOwnProperty方法(比如{ hasOwnProperty: () => false }),会导致误判 → 推荐用Object.hasOwn(obj, key)避免此问题 - 传入 null / undefined / 原始值(如字符串字面量)会报错 →
Object.hasOwn同样报错,但更早暴露问题 - 想检测 Symbol 属性时,
hasOwnProperty支持,但必须传 Symbol 实例(不能用字符串)


















