最佳实践:Javascript for循环

时间:2018-04-13 05:00:07

标签: javascript loops for-loop

编写javascript for循环的最佳做法是什么?

我开始写这样的话:

for(var i = 0; i < array.length; i++){
    //dostuff
}

但后来我发现计算每次传球的长度并不理想,所以应该更像是:

var len = array.length;
for(var i = 0; i < len; i++){
    //dostuff
}

但是如果你减少而不是增加,循环会更快:

var lenArr = array.length;
for(var len = lenArr; len > 0; len--){
    //dostuff
}

然而,如果你想在嵌套循环集群中打破一个循环,那么这种循环并不真正有效,所以你应该进入使用标签的习惯:

var lenArr = array.length;
var lenArr2 = array2.length;

loop1: for(var len = lenArr; len > 0; len--){
    loop2: for(var len2 = lenArr2; len2 > 0; len2--){
        //dostuff
        break loop2;
    }
}

是否有其他需要更改的内容,或者这是在Javascript中编写for循环的最佳做法?

4 个答案:

答案 0 :(得分:2)

如果你有阵列而不是使用forEach

array.forEach(ele=> {

});

通过这种方式,您可以保持代码清晰易懂,而且不必执行与长度相关的代码。

中断不适用于forEach,但你可以写return来表达forEach,如

array.forEach(ele=> {
   ele.array.forEach(ele=> {
     //do stuff 
     return;
   });
});

注意:

  1. for循环更快。
  2. forEach较慢,但更适合函数式编程范例。
  3. 答案基于问题的标题:最佳实践,为什么给出建议使用forEach over。

答案 1 :(得分:1)

关于保存array.length:尽管在JavaScript诞生之初,将.length值保存在变量中还是有所不同,但现代JavaScript引擎仍会运行{ {1}}的循环速度与第一个版本一样快。

向后迭代也不能保证在现代引擎上运行得更快。还需要考虑对CPU进行优化以预见正向内存引用,尽管这仅在JS引擎决定将数组存储为连续内存块时才有意义。

关于标签的使用:大多数人不会考虑这种最佳做法。如果先前的优化(关于for)涉及循环的所有迭代,则此问题仅适用于两个循环中的单个退出。无论使用哪种解决方案,它都表示恒定时间,并且不能成为循环整体性能的决定因素。

因此,在这种情况下,我肯定会遵循良好的编码习惯,而不是出于微小的优化考虑。当您只想退出当前循环时,一个.length就足够了。

如果您想从嵌套循环中快速退出,请考虑将其放入函数中,以便可以使用break

return

答案 2 :(得分:0)

您可以使用Array.forEach

使用forEach的优点如下

  1. 提供功能范围,只要您需要在循环中执行某些异步功能,您就不需要创建任何IIFE
  2. 它使您的代码保持整洁且更具上下文性
  3. 示例代码

    arr.forEach(function(item, index){
        // do stuff    
    });
    

答案 3 :(得分:0)

实际上,我更喜欢for...of,因为你仍然可以break而且它的输入更少,而且它的可读性更高:

  for(const el of array)

如果您还需要索引:

  for(const [index, el] of array.entries())

或者如果你需要从后到前迭代:

 for(const el of array.reverse())