我刚刚看到道格拉斯克罗克福德的新视频,他说他不再使用循环。相反,他使用.forEach和.map等来遍历数组。但我不明白为什么会更好。为什么我应该使用.forEach语法而不是for循环语法?
我知道for循环语法有点长,但不是马上清楚你在做什么(即使我认为,如果你不知道语言)。那么为什么这更好?
的视频可以在这里找到:http://youtu.be/bo36MrBfTk4?t=21m30s
我刚刚看到道格拉斯克罗克福德的新视频,他说他不再使用循环。相反,他使用.forEach和.map等来遍历数组。但我不明白为什么会更好。为什么我应该使用.forEach语法而不是for循环语法?
我知道for循环语法有点长,但不是马上清楚你在做什么(即使我认为,如果你不知道语言)。那么为什么这更好?
的视频可以在这里找到:http://youtu.be/bo36MrBfTk4?t=21m30s
两种方法总是更好,它取决于具体情况,也可能取决于您感觉舒适的方面。
其中之一,当使用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);
}
这种方法适合对功能效果更好(例如使用map
或filter
生成一个新的集合),使用forEach
没有那个确切的好处。
函数方法的缺点是回调函数获取自己的上下文。如果您在方法中使用它,你需要绑定的回调函数,以获得正确的上下文:
var added = arr.map(function(e){
return e + this.change;
}.bind(this));
总之,经常的情况是不是这样简单的例子更加复杂。然后,无论您选择哪种方法,都不会对性能或可读性产生太大影响。
从本质上说,你是正确的,引擎盖下.MAP和.forEach可能会使用一个for循环自己。真的,这归结于偏好。
在我看来,使用.map,.reduce,.forEach可以创建更清晰的代码。当我来看你的代码时,一个for不会马上告诉我你的意图是什么,除了你正在做的事情之外,我必须阅读代码来确定你的意图。
当我遇到上面列出的功能之一时,我确切知道你的意图是什么。例如,如果我遇到.map,我知道您正在对您的集合中的每个项目应用操作。
老实说,我不使用任何这些,因为我倾向于使用underscorejs来处理列表操作操作。
迭代函数更清晰。每种方法都有自己的用例。虽然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。如果您正在运行的服务的访问量非常大,则性能差异很大,因为迭代函数会产生大量的函数调用。
我认为for循环没有什么问题,但是整个软件行业在功能编程方面存在更广泛的趋势。我认为这个功能非常强大,并且尽可能地切换到功能模式。好消息是Javascript已经提供了函数式编程的许多方面,而像Java这样的语言现在不得不进行翻新。 – 2014-12-02 11:51:37
在foreach中,您不需要知道数组的长度,并且您可以立即访问当前的数组元素。 – Justinas 2014-12-02 11:51:41