繁体   English   中英

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

[英]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);
}

这种方法更适合功能性结果(例如,使用mapfilter生成新集合),而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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM