Iterators & Generators
Iterators
一个迭代器对象 ,知道如何每次访问集合中的一项, 并跟踪该序列中的当前位置。在 JavaScript 中 迭代器是一个对象,它提供了一个next() 方法,用来返回序列中的下一项。这个方法返回包含两个属性:done和 value。
迭代器对象一旦被创建,就可以反复调用next()
来看个例子
1 | function makeIterator(array){ |
来看Kyle的例子
1 | var str = 'Hello'; |
Declarative Iterators
1 | var str = 'Hello'; |
在ES6我们新增了for-of循环, 替换上面的结构:
1 | var str = 'Hello'; |
这里说一个解构小知识, …运算符运用了iterator
1 | var str = 'Hello'; |
自定义迭代器让我们定义自己的迭代规则。这种结构特别适用于我们自己创建的数据结构。
Data Structure without lterators
不是所有的数据结构都有iterator, 比如对象
1 | var obj = { |
在这种情况下, 我们可以自定义自己的iterator
1 | var obj = { |
Generators
虽然自定义的迭代器是一个有用的工具,但由于需要显式地维护其内部状态,因此需要谨慎地创建。Generators提供了一个强大的选择:它允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。
GeneratorFunction 是一个可以作为迭代器工厂的特殊函数。当它被执行时会返回一个新的Generator对象。 如果使用function*语法,则函数将变为GeneratorFunction。
来看个例子:
1 | function* idMaker(ids = []) { |
OK, 我们来看一下Kyle的例子
1 | function *main () { |
好的, 我们用Generator重写一次上面obj没有默认iterator的例子
1 | var obj = { |