【问题标题】:Why should I use the .forEach syntax instead of the for loop syntax?为什么我应该使用 .forEach 语法而不是 for 循环语法?
【发布时间】:2014-12-02 20:18:35
【问题描述】:

我刚刚观看了 Douglas Crockford 的一个新视频,他说他不再使用 for 循环了。相反,他使用 .forEach 和 .map 等来遍历数组。但我不明白为什么会更好。

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

视频可以在这里找到:http://youtu.be/bo36MrBfTk4?t=21m30s

【问题讨论】:

  • 我不认为 for 循环有什么问题,但是在整个软件行业中,函数式编程有一个更广泛的趋势。我发现它真的很强大,并且尽可能地切换到功能模式。好消息是 Javascript 已经提供了函数式编程的许多方面,而像 Java 这样的语言现在必须进行改进。
  • 在 foreach 中你不需要知道数组的长度,你也可以立即访问当前的数组元素。

标签: javascript for-loop


【解决方案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));

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

【讨论】:

    【解决方案2】:

    迭代函数更加清晰。每种方法都有自己的用例。而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。如果您运行的服务具有大量访问者,则性能差异会很大,因为迭代函数会产生大量函数调用。

    【讨论】:

      【解决方案3】:

      本质上你是正确的,在引擎盖下 .map 和 .forEach 可能自己使用了一个 for 循环。这真的取决于偏好。

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-07
        • 2011-05-21
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        相关资源
        最近更新 更多