两个数组迭代之间的区别

时间:2012-10-18 18:15:20

标签: javascript for-loop

我只是想知道这些数组迭代之间的区别,以及为什么第二个似乎很少使用它,它有什么问题呢?

var items = [ /*...*/ ]
for (var i = 0; i < items.length; i++) {
    var item = items[i];
    // Do some stuff with the item
}

第二种方式:

var items = [ /*...*/ ]
for (var i, item; item = items[i]; i++) {
    // Do some stuff with the item
}

3 个答案:

答案 0 :(得分:9)

第一个保证总是遍历每个元素。

如果遇到类似虚假的元素,第二个会中途停止,例如0。

答案 1 :(得分:1)

在第二个for循环中,您需要初始化您的i变量。

考虑:

var items = ["string", false, null, 0, "", {}, []];

第一个循环将遍历整个数组。但是,第二个循环的条件将评估分配给item的值。该部分的布尔值为:

!!(item = items[i])

有效值,例如 null 0 false “”(空字符串) undefined 将评估为false并中断。在上面的数组中,当项目被分配到 false

时,您将跳出for循环

答案 2 :(得分:0)

在第二种情况下,终止条件有点特定于javascript - 当赋值转换为布尔值时,循环终止 false ,这也会在读取数组元素超出其边界时发生。这与其他流行语言相反,在这些语言中,对阵列的out-of-bouns会导致某种错误,并且无法保证终止 for 循环的正确条件。当任何具有除javascript之外的其他语言背景的程序员编写迭代循环时,他/她可能会避免使用他知道在这些语言中不正确甚至危险的模式。

我认为这是主要原因。但是,如上所述,其他事情是,即使在到达迭代数组的末尾之前,这个条件可能 false - 例如,当赋值元素的值为 false ,0或者任何其他值,在javascript中隐式转换为 false