6

因此,当我使用 for..in 循环遍历对象键时,我的 IDE 不喜欢。我收到警告:

可能对意外(自定义/继承)成员进行迭代,可能缺少 hasOwnProperty 检查

所以我明白了它在说什么,所以在这种情况下,使用类似的东西for (const key of Object.keys(obj))而不是for (const key in obj)?

在性能方面,两者之间有什么真正的区别吗?

4

2 回答 2

18

Object.keys循环数组和使用语句循环之间存在细微差别for...in,在大多数情况下不会注意到这一点。Object.keys(obj)只返回一个具有对象自身属性的数组,同时for...in返回在原型链中找到的键,以便后者对原型进行额外检查,obj然后再检查原型的原型等等以此类推,直到整个原型链都被访问过。这无疑使第二种方法的效率低于第一种方法,但正如我已经提到的,在大多数情况下几乎不会注意到这种差异。

对于更正式的方法,如MDN中所述:

Object.keys() 方法返回给定对象自己的可枚举属性的数组,其顺序与 for...in 循环提供的顺序相同(不同之处在于 for-in 循环将原型链中的属性枚举为出色地)。

于 2017-04-17T06:30:03.980 回答
4

您仍然可以使用for(var key in obj){}. 似乎期望Object.hasOwnPropertyfor..in循环内

这是因为for..in即使密钥在原型链中,也会在原型链中查找并返回 true。

而只有在 key 是它的属性Object.hasOwnProperty时才会返回 true 。owns

你可以这样做

for(var key in obj){
 if(obj.hasOwnProperty(key)){
  // rest of code}
}
于 2017-04-17T06:32:42.550 回答