JavaScript中的迭代器和生成器详解
处理集合里的每一项是一个非常普通的操作,JavaScript提供了许多方法来迭代一个集合,从简单的for和for each循环到 map(),filter() 和 array comprehensions(数组推导式)。在JavaScript 1.7中,迭代器和生成器在JavaScript核心语法中带来了新的迭代机制,而且还提供了定制 for…in 和 for each 循环行为的机制。
迭代器
迭代器是一个每次访问集合序列中一个元素的对象,并跟踪该序列中迭代的当前位置。在JavaScript中迭代器是一个对象,这个对象提供了一个 next() 方法,next() 方法返回序列中的下一个元素。当序列中所有元素都遍历完成时,该方法抛出 StopIteration 异常。
迭代器对象一旦被建立,就可以通过显式的重复调用next(),或者使用JavaScript的 for…in 和 for each 循环隐式调用。
简单的对对象和数组进行迭代的迭代器可以使用 Iterator() 被创建:
生成器允许对序列延迟计算(lazy computation),在需要时按需计算元素。生成器表达式在句法上几乎和数组推导式相同—它用圆括号来代替方括号(而且用 for...in 代替 for each...in)—但是它创建一个生成器而不是数组,这样就可以延迟计算。你可以把它想象成创建生成器的简短语法。
假设我们有一个迭代器 it 来迭代一个巨大的整数序列。我们需要创建一个新的迭代器来迭代偶数。一个数组推导式将会在内存中创建整个包含所有偶数的数组:
var doubles = [i * 2 for (i in it)];
而生成器表达式将会创建一个新的迭代器,并且在需要的时候按需来计算偶数值:
var it2 = (i * 2 for (i in it));
print(it2.next()); //it 里面的第一个偶数
print(it2.next()); //it 里面的第二个偶数
当一个生成器被用做函数的参数,圆括号被用做函数调用,意味着最外层的圆括号可以被省略:
var result = doSomething(i * 2 for (i in it));
End.