hasownproperty在严格模式下行为不变,仅判断属性是否为对象自有属性;但直接调用会因this绑定问题在严格模式报错,推荐用object.prototype.hasownproperty.call或es2022的object.hasown。

hasOwnProperty 在严格模式下没有特殊用法,它的行为和非严格模式完全一致。
核心逻辑不变
无论是否启用严格模式,hasOwnProperty 都只做一件事:判断指定属性名是否为对象自身的(即非继承自原型链的)自有属性。它不关心执行上下文是否严格,也不改变返回值规则或参数处理方式。
- 传入字符串或 Symbol 类型的属性名,返回
true或false - 不会查找原型链,哪怕该属性在
Object.prototype上存在 - 对
undefined值的属性依然返回true(只要它是对象自己定义的)
但严格模式会影响调用环境的安全性
虽然方法本身没变化,但严格模式会让某些潜在风险更早暴露:
- 如果误把
hasOwnProperty当作普通函数直接调用(如hasOwnProperty('x')),非严格模式可能隐式绑定到window或global,而严格模式下会直接报ReferenceError - 当对象自身意外覆盖了
hasOwnProperty方法时(例如{ hasOwnProperty: () => false }),严格模式不会改变这一覆盖行为,但你更可能在开发阶段就注意到这种危险写法
推荐写法:避免依赖 this 绑定
为彻底规避原型污染或方法被覆盖的风险,建议统一使用外部 Object.prototype.hasOwnProperty.call:
const obj = { a: 1 };
Object.prototype.hasOwnProperty.call(obj, 'a'); // true
Object.prototype.hasOwnProperty.call(obj, 'toString'); // false
这种方式不依赖对象自身是否拥有该方法,也不受严格/非严格模式影响,是更健壮的实践。
现代替代方案:Object.hasOwn
ES2022 引入的 Object.hasOwn 是 hasOwnProperty 的安全升级版:
- 可直接用于
Object.create(null)创建的对象(hasOwnProperty会报错) - 不会被对象自身同名属性覆盖
- 同样兼容严格与非严格模式,且语义更清晰
例如:Object.hasOwn({ a: 1 }, 'a') → true;Object.hasOwn(Object.create(null), 'a') → false。











