何时使用迭代器而不是普通的循环结构 - Javascript

5

我一直在阅读关于ES6中的迭代器可迭代对象的文章。我看到了以下示例。

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. 

但我的疑虑是我们可以简单地使用for、while等循环来获取数组中的每个元素,就像下面这样。
for (let i = 0; i < someArr.length; i++) {
  console.log(someArr[i]);
}

那么,使用可迭代对象和迭代器相比于普通循环结构(如for,while等)有什么优势呢?
我在阅读的文章中没有得到任何澄清。谢谢您的帮助。

你曾经使用过 for..of 或者 ...values 吗?它们是基于迭代器的。像 Array.prototype.map 这样的东西不是,但是非常有用。我会反过来问,为什么你要使用基于索引的 for 循环呢? - Aluan Haddad
1
https://medium.freecodecamp.org/demystifying-es6-iterables-iterators-4bdd0b084082 - Taki
@AluanHaddad 我已经使用了 for..of...values。我的疑问是为什么我们需要编写 let iteratorVar = someArr[Symbol.iterator](); 来循环,而不是直接使用现有的循环结构。 - Sivakumar Tadisetti
3
通常情况下不需要使用它。偶尔使用它可能会有用,但应该是例外而不是惯例。 - Aluan Haddad
2
在大多数情况下,它并没有什么用处。但是当你需要它时,它可以成为一个非常有价值的工具。由于任何东西都可以是可迭代的,只要它实现了这个接口,那么你就可以设置一个无限的信息源,并且只要你想要,就可以从迭代器中调用下一个值。你可以在下面放置一个伪随机数生成器或者消费某种潜在的无限信息流并对其进行处理,比如推特之类的东西。另一个用途可能是处理一些有限的但可能一次性读取很昂贵的东西,比如分块读取文件。 - VLAZ
迭代器的主要好处是它统一了整个API,如果你正在编写一个对象类,可以考虑使用它。任何可迭代的内容都可以被for...of处理。而传统的for循环并不直观。同样的道理,你可以说为什么我们需要for inforEach,它们都有其存在的目的。 - Leo Li
1个回答

4
许多语言中的功能都是用迭代器定义的。
这包括诸如for..of循环以及数组、映射和集合的展开(...values)等语法。
尽管如此,你几乎永远不需要直接操作迭代器本身。
然而,在某些情况下,能够这样做是必不可少的。
例如,想象一下我们要编写一个zip函数,将多个可迭代对象的对应元素组合在一起。
由于可迭代对象可以是无限的,因此我们不能创建一个数组并返回它。一方面,我们不能分配无限量的内存,另一方面,我们也不能将输入限制为有限序列。
在这种情况下,直接操作迭代器就可以得到我们所需要的东西。
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
不错的写作!这就是为什么我说在语言中,一个统一、可预测的API非常重要,尤其是对于想要构建更加复杂应用程序的人来说。 - Leo Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接