return

196 阅读1分钟
return()方法必须返回一个有效的 IteratorResult 对象。简单情况下,可以只返回{ done: true }。可能的情况包括:for-of 循环通过 break、continue、return 或 throw 提前退出;解构操作并未消费所有值。
class Counter {
  constructor(limit) {
    this.limit = limit;
  }
  [Symbol.iterator]() {
    let count = 1,
      limit = this.limit;
    return {
      next() {
        if (count <= limit) {
          return { done: false, value: count++ };
        } else {
          return { done: true };
        }
      },
      return() {
        console.log('Exiting early');
        return { done: true };
      },
    };
  }
}

let counter3 = new Counter(5);
let [a, b] = counter3;
// Exiting early

因为 return()方法是可选的,所以并非所有迭代器都是可关闭的,数组的迭代器就是不能关闭的。要知道某个迭代器是否可关闭,可以测试这个迭代器实例的 return 属性是不是函数对象。不过,仅仅给一个不可关闭的迭代器增加这个方法并不能让它变成可关闭的。这是因为调用 return()不会强制迭代器进入关闭状态。即便如此,return()方法还是会被调用。如果迭代器没有关闭,则还可以继续从上次离开的地方继续迭代。