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
参考混淆,但它们仍然很前卫,可以忽略。
在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
参考混淆,但它们仍然很前卫,可以忽略。