Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript效率:';对于';vs';forEach&x27;_Javascript_Loops_For Loop_Foreach - Fatal编程技术网

Javascript效率:';对于';vs';forEach&x27;

Javascript效率:';对于';vs';forEach&x27;,javascript,loops,for-loop,foreach,Javascript,Loops,For Loop,Foreach,2017年Javascript for()循环与a.forEach的当前标准是什么 我目前正在通过Colt Steeles在Udemy上的“网络开发训练营”工作,他在教学中更喜欢forEach而不是for。然而,作为课程工作的一部分,我在练习中搜索了各种内容,我发现越来越多的建议使用for-循环,而不是forEach。大多数人似乎认为for循环更有效 这是自课程编写以来(大约2015年)发生的变化,还是它们各自的优点和缺点,我们将通过更多的经验来学习 如果您有任何建议,我们将不胜感激。 for循

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

我目前正在通过Colt Steeles在Udemy上的“网络开发训练营”工作,他在教学中更喜欢
forEach
而不是
for
。然而,作为课程工作的一部分,我在练习中搜索了各种内容,我发现越来越多的建议使用
for
-循环,而不是
forEach
。大多数人似乎认为for循环更有效

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

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

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

for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}
[].forEach((val, index)=>{
   ...
});
好处:
  • 不涉及变量设置(迭代数组的每个元素)
  • 函数/箭头函数将变量范围限定到块
    在上面的示例中,
    val
    将是新创建的函数的参数。因此,在循环之前称为
    val
    的任何变量在循环结束后都会保留其值
  • 主观上更易于维护,因为它可能更容易识别代码在做什么——它在可枚举项上迭代;而for循环可以用于任意数量的循环方案

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

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

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

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

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

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

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

为什么要将自己与某人对2017标准的主观想法联系起来?采用一个永恒的标准,比如编写干净的、可维护的代码,知道工程师们正在努力使最常用的结构非常高效,然后在遇到特定的性能问题时进行性能优化。纯速度很难打败原生的
forEach()
为每次迭代调用回调;因此,这显然会带来一些开销。作为一名开发人员,我几乎不使用map、filter或reduce方法来完成大部分工作。@a.T.只要你不是那种纯粹为了迭代而使用
map
,并丢弃它生成的新数组的人。我不知道仅仅在这个网站上,我就必须纠正多少人对特定功能的选择。@canon同意,循环选择很重要,在选择时应该记住这些方法的输出和剩余。我认为为了可读性,应该避免简单的“for loop”。优秀、彻底、不冒昧的回答,不受单个时间点、实现或微基准测试的限制。for-loop在调试方面通常有一个优势:它们是一个需要介入、断点和检查的trivila。使用forEach()时,额外的回调级别会使事情变得复杂一些。我非常喜欢这个答案中的解释和短语
[…],如果性能和优化就是一切,那么除了机器或程序集之外就没有其他代码了。
。我相信,对于声明块范围局部变量的
let
语句,
forEach
的第二个好处不再是
for
循环的优势,除非在不支持
let
@Microsis的环境中,没有理由,当时可能是微优化,但这是一种浏览器/引擎选择,不可避免地要改变。在示例中,它们是等价的。有时,在我的示例中,我尝试展示一种稍微不同的使用语法的方式,让新手思考。人们经常看到
i++
,但是
++i
吸引了人们的注意力,并导致人们发现for循环的最后部分是一个表达式,它可以用于许多操作,而不仅仅是设置循环增量。我要补充的是,这个答案可能需要一些修正更新或增补。例如,现在许多浏览器内部优化为字节码,因此如果满足某些条件,重复操作只执行一次。我认为,如果数组在循环体中未被触及,那么它只能检索
arr.length
一次。我欢迎更熟悉的人加入。
for (var i=0, n=arr.length; i < n; ++i){}