【发布时间】: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