是否有理由在ES6中使用array.forEach()for ...两者都可以使用?

lys*_*ing 3 javascript arrays foreach ecmascript-6

随着ECMAScript 2015(ES6)中引入的for..of,是否有任何理由继续提倡稍微使用旧版本Array.prototype.forEach()

今天在ES6中编写的许多代码包含如下代码:

let sum = 0;
values.forEach((value) => {
    sum += value;
});
Run Code Online (Sandbox Code Playgroud)

在几乎所有这些情况下,可以使用等效的for循环:

let sum = 0;
for (let value of values) {
  sum += value;
}
Run Code Online (Sandbox Code Playgroud)

两种格式的更简洁版本:

values.forEach(value => sum += value);
for (let value of values) sum += value;
Run Code Online (Sandbox Code Playgroud)

for..of格式不仅适用于Array对象,也适用于其他迭代,并且性能更高.不同于Array.prototype.map()没有返回值,.forEach()这将允许进一​​步链接.

可以想象它可以更具可读性,因此在调用链的末尾(下面的示例)中有用,或者如果每个项应该应用于未知的回调.抛开那些边缘情况,是否应该避免?

['1', '2', 3].map(Number)
             .forEach(value => sum += value)
Run Code Online (Sandbox Code Playgroud)

ssu*_*ube 5

最重要的区别是你不能在forEach没有投掷的情况下突破,这就是使用流量控制的异常,因此也就是不好的做法.

对于数组循环,将永远触摸每一个元素,for ... of并且forEach是相当相当的.但是,如果你有一个循环可以保证每次击中每个元素,你可以使用mapreduce代替任何for-each构造并使其更具功能性.

你的总和例子很棒reduce.forEach当你可以使用时,不是最好的选择:

let sum = values.reduce((sum, value) => sum + value, 0);
Run Code Online (Sandbox Code Playgroud)

如果要从数组中选择元素,通常可以使用filter.对于流量控制everysome工作,必要时进行反演(如评论中所述).

通常,forEach通常可以用更具描述性和专业性的数组方法替换,除非您特别需要引起副作用.for...of对于可迭代对象非常有用,但并不总是数组的最佳选择.