迭代是一种所有编程语言中都可以看到的模式。ECMAScript 6 正式支持迭代模式并引用了两个新的语言特性: 迭代器和生成器。
迭代器是一个可以由任意对象实现的接口,支持连续获取对象产出的每一个值。任何实现Iterable 接口的对象都有一个 Symbol.iterator 属性,这个属性引用默认迭代器。 默认迭代器就像一个迭代器工厂,也就是一个函数,调用之后会产生一个实现Iterator接口对象。
迭代器必须通过连续调用 next() 方法才能连续取得值, 这个方法返回一个IteratorObject。 这个对象包含一个done 属性和一个value 属性。 前者是一个布尔值, 表示是否还有更多值可以访问;后者包含迭代器返回的当前值。
这个接口可以通过手动反复调用 next() 方法来消费, 也可以通过原生消费者, 比如 for-of 循环来自动消费 。
生成器是一种特殊的函数。 调用之后会返回一个生成器 。 生成器对象实现了Iterable 接口 , 因此可用在任何消费可迭代对象的地方。 生成器 的独特之处在于 支持 yield关键字, 这个关键字能够暂停执行生成器函数。 使用yield 关键字还可以通过 next() 方法接收输入和产出输出。 在加上星号之后, yield 关键字可以将跟在它后面的可迭代对象序列化为一连串值。