在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)
会导致不同的结果?有谁可以展示一个具体的例子?
答案 0 :(得分:2)
他们永远不会 1 导致不同的结果,这就是为什么他们都被认为是正确的。
对象{}
总是从对象原型继承并且没有自己的密钥,因此访问它上面的.hasOwnProperty
方法将获得您想要的。 Object.prototype
是全局Object
构造函数的不可写属性,因此它总是引用对象原型。
现在,在某些情况下,表达式无法执行您希望它执行的操作:
Object
变量Object
标识符,因此它没有引用全局Object.prototype.hasOwnProperty
Function.prototype.call
1:显然,前两个边缘情况只会混淆Object.prototype
引用,但它们仍然足以被忽略。