关于循环:Javascript效率:’for’vs’forEach’

Javascript efficiency: 'for' vs 'forEach'

2017年Javascript中for()循环与a.foreach的当前标准是什么?

我目前正在努力通过柯尔特·斯蒂尔斯在乌迪米的"网络开发训练营",他在他的教诲中倾向于使用forEach而不是for。然而,作为课程工作的一部分,我在练习中搜索了各种各样的东西,我发现越来越多的建议使用for循环,而不是forEach。大多数人似乎说for循环更有效。

这是自课程编写以来(大约2015年)发生的变化,还是它们各自的优缺点,我们将从中学习到更多的经验。

任何建议都将不胜感激。


对于

for循环效率更高。它是一个循环结构,专门设计用于在条件为真时迭代,同时提供一个步进机制(通常用于增加迭代器)。例子:

1
2
3
for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}

这并不意味着for循环总是更有效,只是JS引擎和浏览器已经对它们进行了优化。多年来,对于哪些循环结构更有效(对于,while,reduce,reverse while,等等),已经有了妥协——不同的浏览器和JS引擎都有自己的实现,它们提供不同的方法来产生相同的结果。随着浏览器进一步优化以满足性能需求,理论上,[].forEach的实现方式可以更快或与for相当。

效益:

  • 有效率的
  • 早期循环终止(符合breakcontinue)
  • 条件控制(i可以是任何内容,并且不绑定到数组的大小)
  • 变量范围(var i使循环结束后i可用)

前额

.forEach是主要在数组上迭代的方法(也可以在其他可枚举对象上迭代,如MapSet对象)。它们是更新的,并且提供主观上更容易阅读的代码。例子:

1
2
3
[].forEach((val, index)=>{
   ...
});

效益:

  • 不涉及变量设置(迭代数组的每个元素)
  • 函数/箭头函数将变量范围限定到块在上面的示例中,val将是新创建函数的参数。因此,任何在循环之前称为val的变量,在循环结束后都将保持其值。
  • 主观上更容易维护,因为识别代码在做什么可能更容易——它在可枚举的上迭代;而for循环可以用于任意数量的循环方案。

性能

性能是一个棘手的话题,通常需要一些经验,当谈到预先考虑或方法。为了提前(在开发过程中)确定可能需要多少优化,程序员必须对过去的问题案例经验有一个很好的了解,并且对潜在的解决方案有一个很好的理解。

在某些情况下使用jquery可能会太慢(一个有经验的开发人员可能知道这一点),而在其他情况下可能是一个问题,在这种情况下,库的跨浏览器兼容性和执行其他功能(如Ajax、事件处理)的方便性将值得节省开发(和维护)时间。

另一个例子是,如果性能和优化就是一切,那么除了机器或程序集之外就没有其他代码了。显然情况并非如此,因为有许多不同的高级别和低级别语言,每种语言都有自己的权衡。这些权衡包括但不限于专业化、开发的易用性和速度、维护的易用性和速度、优化代码、无错误代码等。

途径

如果您没有很好的理解某些东西是否需要优化代码,那么首先编写可维护的代码通常是一个很好的经验法则。从那里,您可以测试并确定在需要时需要更多关注的内容。

也就是说,某些明显的优化应该是一般实践的一部分,不需要任何思考。例如,考虑以下循环:

1
for (var i=0; i < arr.length; ++i ){}

对于循环的每次迭代,javascript都会检索arr.length,这是每个循环的一个关键查找成本计算操作。没有理由不这样做:

1
for (var i=0, n=arr.length; i < n; ++i){}

这做了同样的事情,但只检索一次arr.length,缓存变量并优化代码。