Javascript效率:'for'vs'forEach'

时间:2017-03-26 17:15:52

标签: javascript loops for-loop foreach

2017年Javascript中使用for()循环与.forEach的当前标准是什么。

我目前在Udemy上通过Colt Steeles“Web Dev Bootcamp”工作,他在他的教导中赞成forEach超过for。但是,我在练习期间搜索了各种各样的东西,作为课程工作的一部分,我发现越来越多的建议使用for - 循环而不是forEach。大多数人似乎都认为for循环更有效。

这是自课程编写以来发生过变化的事情(大约在2015年),或者是每个人的真正利弊,哪一个人会学到更多的经验。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:128)

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

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

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

优点:

  • 高效
  • 早期循环终止(荣誉breakcontinue
  • 条件控制(i<n可以是任何东西而不是绑定到数组的大小)
  • 变量范围(var i在循环结束后留下i

的forEach

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

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

优点:

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

性能

性能是一个棘手的话题,在预见或方法方面通常需要一些经验。为了提前确定(在开发过程中)可能需要多少优化,程序员必须很好地了解过去的问题案例经验,以及对潜在解决方案的良好理解。

在某些情况下使用jQuery有时可能太慢(有经验的开发人员可能知道),而其他时间可能不是问题,在这种情况下,库的跨浏览器合规性和执行其他功能的简易性(例如,AJAX,事件处理)值得节省开发(和维护)时间。

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

方法

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

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

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

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

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

这也是一样的,但只检索arr.length一次,缓存变量并优化代码。