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 循环的最佳实践?
如果你有数组而不是利用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)
笔记:
答案基于问题标题:最佳实践,为什么给出建议使用 forEach 而不是 for。
关于保存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)
至于最佳实践:这实际上取决于您需要实现的目标。有多种提供迭代的数组方法,例如forEach、map、reduce、reduceRight、filter、 、some、every、find、findIndex、includes...,每种方法都有其用途。如果他们符合目的,那就和他们一起去。如果您不需要索引,而只需要值,则使用for..of. 如果您确实需要每一个细节的优化,那么老式for循环可能是赢家。