ES6 for of - 可迭代对象是否只被评估一次?

3

考虑一种简单的for形式:

for (const elem of document.getElementsByTagName('*') {
  // do something with elem
}

getElementsByTagName只会被评估一次还是在每次迭代中都会被评估?谢谢!

只执行一次,否则将无限循环。 - Daniel A. White
1个回答

2
在这种情况下,它被评估一次以获取一个“可迭代对象”,然后使用它来获取一个“迭代器”。它重复使用该迭代器来获取所有值并将它们传递给您的“for”块。这与使用生成器函数执行以下操作非常相似:
function* getIntegers(max) {
  for (let i = 0; i <= max; i++) {
    yield i;
  }
}

const iterator = getIntegers(15);

while (true) {
  const { done, value } = iterator.next();
  if (done) {
    break;
  }

  console.log(value);
}

正如loganfsmyth所指出的那样,生成器函数会直接返回一个迭代器。注意:生成器函数也可以与for..of结构一起使用

请参阅MDN文章了解更多信息。


1
几乎,它被评估为获取一个“可迭代对象”,然后从中获取迭代器。生成器函数直接返回一个迭代器,而迭代器也是可迭代的,所以它们在这种情况下也可以使用。 - loganfsmyth
@loganfsmyth 我总是把术语搞混了。谢谢你的解释。:-) - philraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接