【问题标题】:How to loop the JavaScript iterator that comes from generator?如何循环来自生成器的 JavaScript 迭代器?
【发布时间】:2016-03-23 21:04:13
【问题描述】:

假设我们有以下生成器:

var gen = function* () {
  for (var i = 0; i < 10; i++ ) {
    yield i;
  }
};

循环遍历迭代器的最有效方法是什么? 目前我手动检查done属性是否设置为true

var item
  , iterator = gen();

while (item = iterator.next(), !item.done) {
  console.log( item.value );
}

【问题讨论】:

  • next 是一个函数,它返回一个对象iterator.next().value iterator.next().done ..所以它应该是item().valueitem().done
  • 如果您的浏览器支持for... of,请放心使用。

标签: javascript iterator generator ecmascript-6


【解决方案1】:

迭代任何可迭代对象(支持@@iterator 的对象)的最佳方法是使用for..of,像这样

'use strict';

function * gen() {
    for (var i = 0; i < 10; i++) {
        yield i;
    }
}

for (let value of gen()) {
    console.log(value);
}

或者,如果你想要一个数组,那么你可以使用Array.from,就像这样

console.log(Array.from(gen());
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

【讨论】:

  • @thefourtheye, const value of gen() 在 Firefox 42 中触发错误(SyntaxError: invalid for/in left-hand side)。 let value of gen() 工作。
  • @FrédéricHamidi 你能在严格模式下试试吗?
  • 是的,我做到了 (fiddle)。不过可能是 Firefox 的问题。
  • @FrédéricHamidi 您的 Fiddle 的语言设置为 Javascript 1.7 :)
  • @RGraham,这是let 被识别所必需的。在“普通”JavaScript 模式下,const value oflet value of 都不起作用(但 var value of 起作用)。
猜你喜欢
  • 2017-08-06
  • 2017-11-10
  • 2016-09-04
  • 2020-06-29
  • 2019-06-05
  • 2018-05-06
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多