Javascript 效率: ‘ for’vs‘ forEach’

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

我目前正在我的工作方式,通过柯尔特斯蒂尔斯“网络发展训练营”的 Udemy,他喜欢在他的教学 forEach超过 for。然而,作为课程作业的一部分,我在练习中搜索了各种各样的东西,我发现越来越多的建议使用 for循环而不是 forEach。大多数人似乎认为 for 循环更有效。

这是自课程编写以来(大约在2015年)发生的变化,还是它们各自真正的优缺点,人们将通过更多的经验来学习。

如有任何建议,我将不胜感激。

123970 次浏览

为了

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

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

这并不是说 为了循环总是更高效,只是 JS 引擎和浏览器已经优化了它们。多年以来,对于哪种循环结构更有效(例如,while,reduce,return-while 等) ,人们已经做出了妥协——不同的浏览器和 JS 引擎有自己的实现,它们提供不同的方法来产生相同的结果。随着浏览器进一步优化以满足性能需求,从理论上讲,[].forEach可以以这样一种方式实现,即它比 for更快或更具有可比性。

好处:

  • 有效率
  • 早期循环终止(荣誉 breakcontinue)
  • 条件控制(i<n可以是任意值,并且不绑定到数组的大小)
  • 可变范围(var i使 i在循环结束后可用)

为每个人

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

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

好处:

  • 不涉及变量设置(迭代数组的每个元素)
  • Function/row-function 将变量作用域设置为块
    在上面的示例中,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一次,缓存变量并优化代码。