编写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循环的最佳做法?
答案 0 :(得分:2)
如果你有阵列而不是使用forEach
array.forEach(ele=> {
});
通过这种方式,您可以保持代码清晰易懂,而且不必执行与长度相关的代码。
中断不适用于forEach
,但你可以写return
来表达forEach,如
array.forEach(ele=> {
ele.array.forEach(ele=> {
//do stuff
return;
});
});
注意:
答案基于问题的标题:最佳实践,为什么给出建议使用forEach over。
答案 1 :(得分:1)
关于保存array.length
::尽管在JavaScript诞生之初,将.length
值保存在变量中还是有所不同,但现代JavaScript引擎仍会运行{ {1}}的循环速度与第一个版本一样快。
向后迭代也不能保证在现代引擎上运行得更快。还需要考虑对CPU进行优化以预见正向内存引用,尽管这仅在JS引擎决定将数组存储为连续内存块时才有意义。
关于标签的使用:大多数人不会考虑这种最佳做法。如果先前的优化(关于for
)涉及循环的所有迭代,则此问题仅适用于两个循环中的单个退出。无论使用哪种解决方案,它都表示恒定时间,并且不能成为循环整体性能的决定因素。
因此,在这种情况下,我肯定会遵循良好的编码习惯,而不是出于微小的优化考虑。当您只想退出当前循环时,一个.length
就足够了。
如果您想从嵌套循环中快速退出,请考虑将其放入函数中,以便可以使用break
:
return
答案 2 :(得分:0)
您可以使用Array.forEach
使用forEach
的优点如下
示例代码
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())