最佳实践:Javascript for 循环

Dan*_*son 8 javascript loops for-loop

编写 JavaScriptfor循环的最佳实践是什么?

我开始是这样写的:

for(var i = 0; i < array.length; i++){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

var len = array.length;
for(var i = 0; i < len; i++){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

var lenArr = array.length - 1;
for(var len = lenArr; len > 0; len--){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想中断一组嵌套循环中的一个循环,这种循环实际上不起作用,因此您应该养成使用标签的习惯:

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

loop1: for(var len = lenArr; len > 0; len--){
    loop2: for(var len2 = lenArr2; len2 > 0; len2--){
        //do stuff
        break loop2;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否还有其他需要更改的内容,或者这是在 JavaScript 中编写 for 循环的最佳实践?

Pra*_*ana 6

如果你有数组而不是利用forEach

array.forEach(ele=> {

});
Run Code Online (Sandbox Code Playgroud)

这样你就可以保持代码干净且易于理解,并且不必编写与长度相关的代码。

Break 不会起作用,forEach但你可以写出returnforEach 就像

array.forEach(ele=> {
   ele.array.forEach(ele=> {
     //do stuff 
     return;
   });
});
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. for循环更快。
  2. forEach 速度较慢,但​​更适合函数式编程范例。

答案基于问题标题:最佳实践,为什么给出建议使用 forEach 而不是 for。

  • 不是真的 - 他从一开始就有“break”的东西:p - 他所做的只是用实际进入循环体的代码修复“这更快”的代码:p (2认同)

tri*_*cot 6

关于保存array.length尽管在 JavaScript 的早期,将.length值保存在变量中会产生影响,但for如果您像第一个版本中那样编写它,现代 JavaScript 引擎将像第一个版本一样快速地运行循环。

向后迭代也不能保证在现代引擎上运行得更快。还需要考虑的是,CPU 经过优化以预测前向内存引用,尽管这仅在 JS 引擎决定将数组存储为连续内存块时才相关。

至于标签的使用:大多数人不会考虑这种最佳实践。先前的优化(涉及.length)涉及循环的所有迭代,而此问题仅适用于两个循环的单个出口。无论您使用什么解决方案,它都代表恒定的时间,并且不能成为循环整体性能的决定因素。

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

如果您想快速退出嵌套循环,请考虑将它们放在函数中,这样您可以使用return

function performNestedLoop(array, array2) {
    for(let i = 0; i < array.length; i++){
        for(var j = 0; j < array2.length; j++){
            //dostuff
            if (exitCondition) return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至于最佳实践:这实际上取决于您需要实现的目标。有多种提供迭代的数组方法,例如forEachmapreducereduceRightfilter、 、someeveryfindfindIndexincludes...,每种方法都有其用途。如果他们符合目的,那就和他们一起去。如果您不需要索引,而只需要值,则使用for..of. 如果您确实需要每一个细节的优化,那么老式for循环可能是赢家。