为什么我应该使用.forEach语法而不是for循环语法?

时间:2014-12-02 11:48:18

标签: javascript for-loop

我刚观看道格拉斯·克罗克福德的一个新视频,他说他不再使用for循环了。相反,他使用.forEach和.map等来循环遍历数组。但我不明白为什么会更好。

我知道for循环语法有点长,但是不能立即清楚你正在做什么(即使我认为,如果你不懂语言)。那为什么这样更好?

视频可在此处找到:http://youtu.be/bo36MrBfTk4?t=21m30s

3 个答案:

答案 0 :(得分:1)

两种方法都不总是更好,这取决于具体情况,也许取决于你感觉舒适的方式。

首先,当使用map时,代码会更清晰一些。您可以看到输出是表达式的结果:

var added = arr.map(function(e){
  return e + 1;
});

使用for循环时,输出结束的地方并不明显:

var added = [];
for (var i = 0; i < arr.length; i++) {
  added.push(arr[i] + 1);
}

此方法更适合功能结果(例如,使用mapfilter生成新集合),使用forEach并没有确切的好处。

功能方法的缺点是回调函数有自己的上下文。如果您在方法中使用它,则需要绑定回调函数以获得正确的上下文:

var added = arr.map(function(e){
  return e + this.change;
}.bind(this));

无论如何,通常情况比这样的简单例子更复杂。那么无论你选择哪种方法都不会对性能或可读性产生太大的影响。

答案 1 :(得分:0)

从本质上讲,你是正确的,在引擎盖下.map和.forEach本身可能会使用for循环。真的,这归结为偏好。

在我看来,使用.map,.reduce,.forEach可以更清晰地创建代码。当我来看你的代码时,一个for并没有告诉我,你的意图是什么,除了你正在做的事情之外,我还必须阅读代码以确定你的意图。

当我遇到上面列出的一个功能时,我确切地知道你的意图是什么。例如,如果我遇到.map,我知道您正在对集合中的每个项目应用操作。

老实说,我不使用任何这些,因为我倾向于使用underscorejs来处理列表操作操作。

答案 2 :(得分:0)

迭代函数更清晰。每种方法都有自己的用例。虽然for循环没有告诉你它的用途,但除非你查看代码。

迭代函数为数组中的每个元素提供了一个单独的闭包。在某些情况下,它会挽救你的生命例如,我认为大多数初学者都写过这样的代码:

for(var i = 0; i < elements.length; i++) {
    elements[i].onclick = function() {
        alert(i);
    }
}

这通常不像预期的那样。

我们必须用函数闭包来包装:

for(var i = 0; i < elements.length; i++) {
    (function(i) {
        elements[i].onclick = function() {
            alert(i);
        }
    })(i);
}

另一方面,有时for循环的执行效果优于迭代函数。是的,它是node.js.如果您运行的服务具有极大访问量,则性能差异很大,因为迭代功能会产生大量的函数调用。