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

时间:2017-04-07 02:14:54

标签: javascript eslint

在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 个答案:

答案 0 :(得分:2)

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

对象{}总是从对象原型继承并且没有自己的密钥,因此访问它上面的.hasOwnProperty方法将获得您想要的。 Object.prototype是全局Object构造函数的不可写属性,因此它总是引用对象原型。

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

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

1:显然,前两个边缘情况只会混淆Object.prototype引用,但它们仍然足以被忽略。