2014-12-02 69 views
1

我刚刚看到道格拉斯克罗克福德的新视频,他说他不再使用循环。相反,他使用.forEach和.map等来遍历数组。但我不明白为什么会更好。为什么我应该使用.forEach语法而不是for循环语法?

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

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

+0

我认为for循环没有什么问题,但是整个软件行业在功能编程方面存在更广泛的趋势。我认为这个功能非常强大,并且尽可能地切换到功能模式。好消息是Javascript已经提供了函数式编程的许多方面,而像Java这样的语言现在不得不进行翻新。 – 2014-12-02 11:51:37

+0

在foreach中,您不需要知道数组的长度,并且您可以立即访问当前的数组元素。 – Justinas 2014-12-02 11:51:41

回答

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)); 

总之,经常的情况是不是这样简单的例子更加复杂。然后,无论您选择哪种方法,都不会对性能或可读性产生太大影响。

0

从本质上说,你是正确的,引擎盖下.MAP和.forEach可能会使用一个for循环自己。真的,这归结于偏好。

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

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

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

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。如果您正在运行的服务的访问量非常大,则性能差异很大,因为迭代函数会产生大量的函数调用。