在JavaScript中的for循环定义中,使用arr[i]和arr.length有什么区别?

6

我发现了一些以前从未见过的东西,我很喜欢。请查看以下示例:

var arr = ['un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept'];

for(var i = 0; arr[i]; i++){
  console.log( arr[i] );
}

替代:

for(var i = 0; i < arr.length; i++){
  console.log( arr[i] );
}

但它们都实现了相同的结果,即输出一个数组列表。

我的问题是,在for循环声明中使用'arr[i]'和'arr.length'有何区别(或相似之处)?

非常感谢。


在使用for(var i = 0; arr[i]; i++){}时,需要小心,以防数组中存在null值。 - ngen
就性能而言,没有(大)区别。在这两种情况下,您都在访问arr的属性。 - Felix Kling
1
通常你会想要把数组的长度缓存到一个变量中,例如for ( var i = 0, len = arr.length; i < len; i += 1 ) { //... },这样就不会“计算”数组的长度。同时,因为根据循环的性质,数组的长度在运行循环过程中可能会发生改变。 - Misha Reyzlin
5个回答

12
var arr = ['un', 'deux', 'trois', null, 'cinq', 'six', 'sept'];

现在怎么样了?

delete arr[2];

现在怎么样?

当数组中存在假值或键的不连续性(例如使用delete运算符创建的键)时,两种方法的差异就会显现出来。使用length循环将产生假值并继续执行,而另一种则会停止。


2

你需要重置 len 变量以进行 while(len--) 测试。我相信 jsPerf 每次测试运行时不会被重置。 - user113716
1
我从http://jsperf.com/arr-i-vs-arrlength/2的评论中添加了两个测试用例。此外,@patrick是正确的。 - Kijewski
是的,你们两个都是正确的,我正在编辑我的帖子,指向Kay的修订版本。谢谢 - Pantelis

2
i < arr.length

这个语句在每次循环时检查i是否小于arr长度

arr[i]

在这里,每个循环周期都会检查在位置iarr是否为真。


"set" 是具有误导性的。"arr位置 i 上是一个真值" - Raynos
1
严谨地说:arr[i] 检查的是值是否为真,而不是它是否存在。 - Kijewski

1

for循环在条件部分为真的情况下迭代。第一次条件为假时,循环停止。

arr[i]只要值不是以下之一就为真:false、0、空字符串、null、undefined、NaN

i < arr.length检查i是否小于数组的大小,这是您应该做的。


1
或者 NaNfalseundefined - Felix Kling
@Felix,谢谢你指出来。我有点太像Perl了。;) - Qtax

1

使用arr[i]作为继续条件检查数组中该位置元素的真实性。这是一个巧妙的技巧,但如果您想迭代包含假值的数组,则无法正常工作,例如

[1, 4, 6, 0, 3, 9]
// or
[true, 'seven', false, -1, {foo: 'bar'}]

使用 i < arr.length 检查当前索引是否小于数组的总长度。


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