何时使用Iterator而不是正常的循环结构 - Javascript

时间:2018-04-24 02:15:14

标签: javascript typescript ecmascript-6 iterator

我一直在阅读有关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等......

我在阅读的文章中没有得到任何澄清。谢谢你的帮助。

1 个答案:

答案 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的数组,并以元素方式使用它们。它将相应的元素组合在一起,并在完成任何元素时停止。

上述例子相当复杂,但具有不做作的优点。

这些场景很重要,但相对较少,直接使用迭代器而不是规则。