我一直在阅读有关ES6中迭代器和 Iterables 的文章。我见过一个如下例子。
u(x, h(x, base)) = U(x) . H(x) . base = base,
但我怀疑的是,我们可以简单地使用for,while和etc循环从下面的数组中获取每个元素
let someArr = [1, 2, 3, 4];
let iteratorVar = someArr[Symbol.iterator]();
console.log(iteratorVar.next().value); // If we log for 5 times, it will print all array elements.
那么,使用Iterables和Iterators比使用正常的循环结构有什么好处,比如for,while等......
我在阅读的文章中没有得到任何澄清。谢谢你的帮助。
答案 0 :(得分:3)
语言中的许多工具都是根据迭代器定义的。
这包括语法,例如for..of
循环以及数组,映射和集合的传播(...values
)。
那说你几乎从来没有理由直接操纵迭代器本身。
然而,有些情况下能够这样做是必不可少的。
例如,假设我们想编写一个zip
函数,它结合了几个迭代的相应元素。
由于iterables可以是无限的,我们不能创建一个数组并返回它。一方面,我们不能分配无限量的内存,另一方面我们不能将输入限制为有限序列。
在这种情况下,直接操作迭代器可以为我们提供我们需要的东西
function* zip(iterables = []) {
if (iterables.length < 2) {
throw RangeError('at least 2 iterables must be provided');
}
const iterators = iterables.map(iterable => iterable[Symbol.iterator]);
while (true) {
const iterations = iterators.map(iterator => iterator.next());
if (iterations.some(iteration => iteration.done)) {
return;
}
yield iterations.map(iteration => iteration.value);
}
}
即zip
需要一个包含2个或更多个iteratables的数组,并以元素方式使用它们。它将相应的元素组合在一起,并在完成任何元素时停止。
上述例子相当复杂,但具有不做作的优点。
这些场景很重要,但相对较少,直接使用迭代器而不是规则。