ES6迭代器的用例

Sla*_*ava 0 javascript node.js ecmascript-6

使用ES迭代器的充分理由是什么?我知道什么在生成器函数(带*的函数)上用于异步操作。纯迭代器还有哪些其他用例?

请给我一些现实生活中的例子,这与node.js或浏览器的使用无关。

jfr*_*d00 6

两个主要原因:

  1. for/of可以构建语言功能,如扩展运算符,破坏性分配等,这些功能可在支持标准迭代器接口的任何对象上运行。

  2. 使用集合的程序员可以直接使用迭代器,也可以通过依赖于它的语言功能间接使用迭代器,并且他们可以通过多种方式与集合进行通用接口,而不必知道集合的类型。

作为ES6语言功能的示例,在该语言中使用迭代器标准是您可以拥有如下语言结构:

for (x of someObj) { ... }
Run Code Online (Sandbox Code Playgroud)

而且for/of逻辑仅在上使用iterator接口someObj。它不必知道有关它可以迭代的所有对象类型的任何具体信息。因此,因此,您可以将其for/of与任何支持标准迭代器的对象一起使用。例如,您可以将其与数组,映射,集合或您创建的支持迭代器接口的任何自定义对象一起使用。

给定对象上的迭代器实现定义了哪些元素将是可迭代的以及它们将以什么顺序出现。

坦白说,我发现使用依赖于迭代器的语言功能for/of比直接使用迭代器更为普遍,这样我就可以以标准方式使用集合,而不必知道集合的类型。

在我自己的编码中,我发现能够在不知道对象是哪种对象的情况下进行迭代非常方便。这使我可以设计一个可以传递a Set或an Array或有时甚至传递a的接口,Map只要我想做的就是对集合中的项目进行迭代,那么我就不必关心它是什么或编写任何代码不一样。如果调用者碰巧有一个Set方便的调用方法,则不必将其转换为Arrayjust即可调用API-他们只需传递即可Set。而且,API中的代码不必检查传递给它的类型以适应其行为。

迭代器也被延迟评估。因此,在开始迭代之前,无需构建整个集合的临时数组。这可以使迭代效率更高,尤其是在集合很大和/或迭代未完全遍历整个集合的情况下。

迭代器可以是无限的。例如,您可能有一个表示无限序列的Fibonacci迭代器。


除了ES6之外for/of,还使用迭代器的其他功能包括:

spread syntax
yield*
destructuring assignment
Array.from()
Run Code Online (Sandbox Code Playgroud)

这些功能可以与支持标准迭代器的任何对象一起使用。


有关更多详细信息,请参见以下文章:

ECMAScript 6中的可迭代项和迭代器

实际中的ES6迭代器和生成器