我只是想知道这些数组迭代之间的区别,以及为什么第二个似乎很少使用它,它有什么问题呢?
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
}
答案 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 。