什么是Iterable

Iterable是ES2015新增的一个Interface。Array,String都是Iterable。接受Iterable的原生语言特性包括:

  • for-of 循环
  • 数组解构([...arr]
  • Array.from()
  • 创建Set
  • 创建Map
  • Promise.all()
  • Promise.race()
  • yield*

Iterable具有Symbol.iterator属性,该属性是一个函数,返回一个新的Iterator:

interface Iterable<T> {
    [Symbol.iterator](): Iterator<T>;
}

Iterator是一个具有next方法的对象,该对象返回IteratorResult

interface Iterator<T, TReturn = any> {
    next(): IteratorResult<T, TReturn>;
}

IteratorResult具有两个属性:done和value。done是个布尔值,当其为false时,说明迭代未结束,我们取用它的value。当它为true时,说明已经结束了,我们对value也不再关心了。

type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
 
interface IteratorYieldResult<TYield> {
    done?: false;
    value: TYield;
}
 
interface IteratorReturnResult<TReturn> {
    done: true;
    value: TReturn;
}