• 迭代器提供了一个 Next()方法,该方法有 Done和 Value两个属性。一但初始化, Next方法可以依次访问对象中的键值。
  • 生成器。 GeneratorFunction:执行时返回一个新的 Generator对象。如果使用 Function方法,会返回一个 GenerationFunction。
  • 可迭代对象。为了实现可迭代,一个对象必须实现@@Iterator或原型链的一个对象,所以带有 Symbol.Iterator属性。分为自定义可迭代和内置可迭代。String,Array,TypedArray,Map和Set都内置可迭代对象,因为它们的原型对象都有一个 Symbol.Iterator方法。
  • 可迭代对象的语法:For-of循环,Spread Synax,Yield*和 Destruction Assignment。
    1. for (let value of ['a', 'b', 'c']) {
    2. console.log(value);
    3. }
    4. // "a"
    5. // "b"
    6. // "c"
    7. [...'abc']; // ["a", "b", "c"]
    8. function* gen() {
    9. yield* ['a', 'b', 'c'];
    10. }
    11. gen().next(); // { value: "a", done: false }
    12. [a, b, c] = new Set(['a', 'b', 'c']);
    13. a; // "a"

高级生成器Edit

生成器根据需求计算它们的产出值,这使得它们能够有效地表示计算成本高的序列,或者甚至如上所述的无限序列。
The Next()方法也接受可用于修改生成器内部状态的值。传递给Next()的值将被视为暂停生成器的最后一个 Yield表达式的结果。
以下是使用 Next(x) 重新启动 fibonacci 序列生成器:

  1. function* fibonacci() {
  2. var fn1 = 0;
  3. var fn2 = 1;
  4. while (true) {
  5. var current = fn1;
  6. fn1 = fn2;
  7. fn2 = current + fn1;
  8. var reset = yield current;
  9. if (reset) {
  10. fn1 = 0;
  11. fn2 = 1;
  12. }
  13. }
  14. }
  15. var sequence = fibonacci();
  16. console.log(sequence.next().value); // 0
  17. console.log(sequence.next().value); // 1
  18. console.log(sequence.next().value); // 1
  19. console.log(sequence.next().value); // 2
  20. console.log(sequence.next().value); // 3
  21. console.log(sequence.next().value); // 5
  22. console.log(sequence.next().value); // 8
  23. console.log(sequence.next(true).value); // 0
  24. console.log(sequence.next().value); // 1
  25. console.log(sequence.next().value); // 1
  26. console.log(sequence.next().value); // 2

你可以通过调用其 Throw()方法强制生成器抛出异常,并传递应该抛出的异常值。这个异常将从当前挂起的生成器的上下文中抛出,就好像当前挂起的 Yield是一个 Throwvalue语句。
如果在抛出的异常处理期间没有遇到 Yield,则异常将通过调用 Throw()向上传播,对 Next()的后续调用将导致 Done属性为 True。
生成器具有 Return(value)方法,返回给定的值并完成生成器本身。