总结
迭代器是 ES6
重要的一部分,并且也是语言若干关键元素的根源。在表面上, 迭代器提供了一种使用简单接口来返回值序列的简单方式。然而,在 ES6
中使用迭代器,还有着种种更加复杂的方式。
Symbol.iterator
符号被用于定义对象的默认迭代器。内置对象与开发者自定义对象都可以使用这个符号,以提供一个能返回迭代器的方法。当 Symbol.iterator
在一个对象上存在时,该对象就会被认为是可迭代对象。
for-of
循环在循环中使用可迭代对象来返回一系列数据。与使用传统 for
循环进行迭代相比,使用 for-of
要容易得多,因为你不再需要追踪计数器并控制循环何时结束。for-of
循环会自动从迭代器中读取所有数据,直到没有更多数据为止,然后退出循环。
为了让 for-of
更易使用,ES6
中的许多类型都具有默认的迭代器。所有的集合类型(也就是数组、Map
与 Set
)都具有迭代器,让它们的内容更易被访问。字符串同样具有一个默认迭代器,能更加轻易地迭代字符串中的字符(而非码元)。
扩展运算符能操作任意的可迭代对象,同时也能更简单地将可迭代对象转换为数组。转换工作会从一个迭代器中读取数据,并将它们依次插入数组。
生成器是一个特殊的函数,可以在被调用时自动创建一个迭代器。生成器的定义用一个星号(*
)来表示,使用 yield
关键字能指明在每次成功的 next()
方法调用时应当返回什么值。
生成器委托促进了对迭代器行为的良好封装,让你能将已有的生成器重用在新的生成器中。通过调用 yield *
而非 yield
,你就能把已有生成器用在其他生成器内部。这种处理方式能创建一个从多个迭代器中返回值的新迭代器。
生成器与迭代器最有趣、最令人激动的方面,或许就是可能创建外观清晰的异步操作代码。你不必到处使用回调函数,而是可以建立貌似同步的代码,但实际上却使用 yield
来等待异步操作结束。