【问题标题】:for..in or for..of Object keysfor..in 或 for..of 对象键
【发布时间】:2017-09-12 18:17:17
【问题描述】:

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

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

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

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

【问题讨论】:

标签: javascript object for-loop for-in-loop for-of-loop


【解决方案1】:

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

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

Object.keys() 方法返回给定对象自己的数组 可枚举的属性,与 a 提供的顺序相同 for...in 循环(区别在于 for-in 循环枚举 原型链中的属性)。

【讨论】:

  • 谢谢。这解释了为什么我的 IDE 会发出警告。
【解决方案2】:

您仍然可以使用for(var key in obj){}。似乎在Object.hasOwnProperty 循环中期待for..in

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

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

你可以这样做

for(var key in obj){
 if(obj.hasOwnProperty(key)){
  // rest of code}
}

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 2015-05-30
    • 2022-12-26
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多