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