【问题标题】:What's the need of iterator in JavaScript arrays?JavaScript 数组中的迭代器需要什么?
【发布时间】:2017-07-10 08:46:42
【问题描述】:

最近我意识到 ES6 迭代器求助于 JS 数组。 我搜索了它,但仍然对它的设计理念感到困惑, 因为其他方法还可以。

另一方面,我被告知不要使用它!

var arr = ['w', 'y', 'k', 'o', 'p'];
var eArr = arr[Symbol.iterator]();

// your browser must support for..of loop
// and let-scoped variables in for loops

for (let letter of eArr) {
  console.log(letter);
}

仅仅是因为for..of的支持吗?

当然,这个功能还没有添加到 JS 对象中。

【问题讨论】:

  • 迭代器用于for/of 和生成器。拥有大量类型(Array、Set、Map、spread syntax、rest 语法、任何生成器)可以以完全相同的方式迭代的整个概念非常非常有用。它创建了一种通用机制,很多东西都可以使用,而无需为每种类型设计新机制。
  • 另外,您现在可以使任何对象类型与 for/of 一起使用,并且您可以通过为您的对象创建适当的迭代器甚至多个不同的迭代器来使其以任何您想要的方式工作。
  • 如果你在一个普遍支持 ES6 迭代器的环境中运行(例如 node.js 的最新版本或转译),那么我只看到了使用迭代器的建议,没有看到任何关于使用迭代器的建议避免他们。例如,几乎没有理由再使用.forEach() 进行迭代,因为for/of 更好(提供更多循环控制,无需额外的函数调用并且可以更好地优化)。
  • @jfriend00,for...of 是否总是得到更好的优化?我已经看到 .forEach(或 .some 等)的性能非常好,优化似乎效果很好。
  • @trincot - 我知道在 ES6 世界中没有理由再使用 .forEach() 了。您只需使用for/of 即可获得更好的控制。我不知道有多少不同的解释器利用了优化for/of,但它应该有更多的优化机会,因为循环完全在解释器的控制之下,而使用 .forEach() 有一种方法可以控制,不是口译员。我使用 for/of 是因为我有更好的循环控制,而 forEach() 没有提供 for/of 所没有的任何东西。

标签: javascript design-patterns iterator ecmascript-6


【解决方案1】:

引入像[Symbol.iterator] 这样的符号的原因包括它允许人们也为自定义对象定义它,因此使它们可用于for ... of、扩展语法和其他可与可迭代对象一起使用的构造。

随着这种可能性的出现,对于要公开可迭代行为的标准对象(如数组)也以这种方式实现它是合乎逻辑的。这使得它更加一致:标准和自定义对象现在都将公开可迭代功能,当且仅当它们定义 [Symbol.iterator]

现在方法(例如Array.from)和构造函数(例如Set)变得可用,它们只需要传递一个可迭代对象,可以是一个数组,但不能必须。这打开了失去耦合的可能性,不同的库甚至可以基于这个iterable protocol进行通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-02-19
    • 2021-01-20
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多