JavaScript循环最佳实践

3

我正在学习JavaScript的教程。以下是性能部分的一节:

循环中的每个语句,包括for语句,在循环的每次迭代中都会执行。 可以放在循环外部的语句或赋值将使循环运行更快。

以下是一个不好的代码示例:

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

以下是一个良好代码的示例:
var i;
var l = arr.length;
for (i = 0; i < l; i++) {

我记不得在那些更注重性能的语言中看到过这样的最佳实践。事实上,bad code 的例子似乎更受欢迎。

这种最佳实践是 JavaScript 特有的,还是其他语言也适用呢?


2
对于较长的数组,最好的做法是缓存长度。我个人更喜欢将变量放在一起,并且从不使用l作为变量名,因为会产生歧义:for (var i=0, n=arr.length; i<n; i++) { - 如果迭代改变了数组的长度,则不需要缓存长度。 - mplungjan
4
无论使用何种语言,最好避免在每次循环中检查数组的length(除非您希望它发生更改)。更好的方式是将数组的长度存储到一个变量中,然后检查该变量。另外,您应该考虑选择一个比W3schools更可靠的教程网站。 - CertainPerformance
说实话,这取决于编程语言。甚至对于JavaScript的每个实现都可能不是真实的。如果数组的长度参数在访问时是静态的(而不是在访问时计算),创建一个新变量只会使用更多的内存。如果参数在每次请求时重新计算,则可以节省计算时间。 - Emil S. Jørgensen
你的“最佳”标准是什么?所谓的“最佳实践”只能基于一些“最佳”标准来确定,例如健壮性、可靠性、可维护性等。性能应该是在列表中排名较低,除非它是一个特别关注的问题。 - RobG
在某些编程语言中,编译器可以判断循环体是否改变了长度。如果没有改变,编译器可以自动为您缓存长度,以便获得相同的性能。 - Barmar
显示剩余8条评论
2个回答

2

不好的做法

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

每次循环迭代时,都会评估条件。如果它是 arr.length,那么每次你都在尝试从 arr 访问 length 属性。然而,另一方面,如果你将其存储在变量中,就可以避免这种操作。


1
如果数组在循环中改变长度,这是一个好的实践。 - Nina Scholz
我同意,那很有道理。我只是好奇为什么这在其他语言中没有被推荐或提到,就我所知。例如,看看如何在C++中迭代向量。 - Q-bertsuit
3
@NinaScholz - 我认为在for循环中更改数组的大小是不好的实践 :) 我相信正确的方法是倒数计数。 - mplungjan
如果数组始终很小,比如少于1,000个元素,那么在每次迭代中缓存length和读取它之间的性能差异可能微不足道(并且对于长度不变的简单循环,这可能已经被优化掉了)。 - RobG

1
在所有的JavaScript循环方式中,我认为for-in循环是最安全的。它可以遍历对象的属性。
let user = {first:"billy", last:"bob"};
for(let i in user){
    console.log(i);
    console.log(user[i]);
}

如果变量为空,它不会抛出错误。

let empty = null;
for (let i in empty){
}

它可以与数组一起使用

let arr = [3,2,1];
for (let i in arr){
    console.log(i);
    console.log(arr[i]);
}   

.map .filter .reduce .forEach 除数组外的任何内容(如null、对象等)都会引发错误。

因此,如果您想要适用于所有内容的循环,则应使用for-in。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接