Object.prototype.hasOwnProperty.call 和 {}.hasOwnProperty.call.(eslint rule guard-for-in) 的区别

Difference between Object.prototype.hasOwnProperty.call and {}.hasOwnProperty.call.(eslint rule guard-for-in)

在eslint规则guard-for-in中,直接使用for in是不正确的。好的做法是

for (key in foo) {
    if (Object.prototype.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
    if ({}.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}

我的问题是 Object.prototype.hasOwnProperty.call(foo, key){}.hasOwnProperty.call(foo, key) 什么时候会导致不同的结果?任何人都可以展示一个具体的例子吗?

它们永远不会1 导致不同的结果,这就是为什么它们都被认为是正确的。

对象 {} 总是继承自对象原型并且没有自己的键,因此访问它的 .hasOwnProperty 方法将得到你想要的。并且 Object.prototype 是全局 Object 构造函数的不可写 属性,因此它也始终引用对象原型。

现在,在某些情况下,表达式不会执行您希望它执行的操作:

  • 有人确实覆盖了全局 Object 变量
  • 有人确实在您的范围内隐藏了 Object 标识符,因此它不会引用全局
  • 有人确实用其他东西覆盖了 Object.prototype.hasOwnProperty
  • 有人确实用其他东西覆盖了 Function.prototype.call

1: 显然,前两个边缘情况只会与 Object.prototype 参考混淆,但它们仍然很前卫,可以忽略。