【问题标题】:JavaScript for ... of loopJavaScript for ... of 循环
【发布时间】:2015-10-08 11:30:34
【问题描述】:

在 MDN https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of

它说While for...in 迭代属性名称,for...of 迭代属性值。

那么,为什么第二个for...of 不记录“hello”?

let arr = [3, 5, 7];
arr.foo = "hello";

for (let i in arr) {
   console.log(i); // logs "0", "1", "2", "foo"
}

for (let i of arr) {
   console.log(i); // logs "3", "5", "7"
}

【问题讨论】:

  • 对数组的迭代(使用 forEach,for..of)仅涵盖它们在零和length-1 之间的属性(即使未定义)。 for..in 是不同的,它迭代任何东西的可枚举属性。
  • 非常感谢您的及时回复。现在,我不知道如何接受你的回答:-)
  • 抱歉,写的稍微详细一点,给我几分钟时间:)

标签: javascript for-loop


【解决方案1】:

for...in 语句以任意顺序迭代对象的可枚举属性。

更准确地说,它的原型链中也包括可枚举的属性。

每个对象都被同等对待。很简单,也很混乱,当它被用于数组时,很多人讨厌它。

for..of 在内部使用符号。任何带有[Symbol.iterator] 的对象都可以被for..of 迭代,但是what 被迭代,并且按照符号中定义的顺序,而不是语句本身的语义(允许惰性最初不知道属性的迭代器)。

在数组的情况下,迭代器会遍历从零到数组length-1 之间的每个属性,甚至是未定义且不会被for..in 拾取的属性。但它完全忽略了其他属性,就像 Array.toString() 从一开始就是这样做的,还有 Array.forEach() 和它在 ES5 中的朋友。这使得数组迭代保持一致。

【讨论】:

  • 非常感谢您的回答,希望遇到同样问题的其他人可以从中受益:-)
  • 事实上这是我今天写的第二个for..in array相关的答案。数组适用于编号有序的值。
  • 没错,arr.foo = "hello" 应该作为对象中的键值对
猜你喜欢
  • 2014-12-18
  • 2020-07-10
  • 2018-01-20
  • 2018-11-14
  • 2020-01-04
  • 2013-08-19
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多