【问题标题】:Difference between iterator and generator in for of loop in JavaScriptJavaScript for of 循环中迭代器和生成器的区别
【发布时间】:2017-08-06 12:36:39
【问题描述】:

让我们创建一个迭代器和一个生成器以类似地工作。

如果 for of 循环包含 break 或 return 语句,它们在循环中表现不同的原因是什么?

生成器完成,而迭代器仍在循环结束后运行。

function *createGenerator() { 
  for ( let i=0; i<5; i++ ) {
    yield i;
  }
}

function createIterator() {
  const arr = [1, 2, 3, 4, 5];
  return arr[ Symbol.iterator ]();
}

function runForOfLoopOn( iterable ) {
  for ( const item of iterable ) {
    if ( item == 2 ) { 
      break;
    }
  }
}

const iterator = createIterator();
const generator = createGenerator();

runForOfLoopOn( iterator );
runForOfLoopOn( generator );

console.log( 'Iterator is done:', iterator.next().done );
console.log( 'Generator is done:', generator.next().done );

【问题讨论】:

    标签: javascript iterator generator for-of-loop


    【解决方案1】:

    for of 循环包含breakreturn 语句时会发生什么?

    当循环体突然完成(使用throwreturn 语句)或被中断时,将调用IteratorClose operation。如果迭代器对象有这样的方法,这基本上相当于调用迭代器的 .return() 方法而不带参数。

    迭代器和生成器行为不同的原因是什么?

    只有生成器才有这样的return() method。您创建的ArrayIterator 没有这样的方法,因为它不需要做任何事情。 return() 方法的主要目的是释放资源,例如通过在生成器函数中触发finally 子句,但数组迭代器不使用任何子句。它可以清除其对迭代数组的引用(这将“关闭”迭代器),但这被认为是不必要的,因为数组迭代器通常会立即被垃圾收集。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2019-09-17
    • 2019-06-05
    • 2018-05-06
    • 2010-11-04
    • 2016-03-23
    • 2015-02-08
    相关资源
    最近更新 更多