[英]Why should I use the .forEach syntax instead of the for loop syntax?
我刚刚看了道格拉斯·克罗克福德(Douglas Crockford)的新视频之一,他说他不再使用for循环了。 相反,他使用.forEach和.map等遍历数组。 但是我不明白为什么会更好。
我知道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。 如果您正在运行具有大量访问者的服务,则性能差异会很大,因为迭代函数会产生大量的函数调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.