Javascript 两个数组迭代之间的差异

Javascript 两个数组迭代之间的差异,javascript,for-loop,Javascript,For Loop,我只是想知道这些数组迭代之间的区别,为什么第二个似乎很少使用,是不是有什么问题 var items = [ /*...*/ ] for (var i = 0; i < items.length; i++) { var item = items[i]; // Do some stuff with the item } 第一个元素保证总是遍历每个元素 第二个循环将在中途停止,如果它遇到一些类似于false的元素,例如0。在第二种情况下,终止条件是特定于javascript的-

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

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

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


第二个循环将在中途停止,如果它遇到一些类似于false的元素,例如0。

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


我想这是主要原因。但另一件事是,如上所述,即使在到达迭代数组的末尾之前,该条件也可能是false——例如,当指定元素的值为false、0或任何其他值时,在javascript中,它隐式地转换为false

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

考虑:

var items = ["string", false, null, 0, "", {}, []];
第一个循环将在整个阵列中循环。但是,第二个循环的条件将计算分配给项的值。此部分的布尔值为:

!!(item = items[i])

有效值如null0false“”(空字符串)未定义将计算为false并中断。在上面的数组中,当项被分配到false

时,您将打破for循环。区别在于,第二个循环甚至不会运行,因为
i
没有用值初始化,除非在这种情况下是一个输入错误,否则NNONNEON是正确的。FWIW,ES5为数组定义了一个
。forEach
方法,这似乎是您想要的:。我想您可以使用
(item=items[I])!=未定义
,但它有点混乱,有副作用和。。。很难看。是的……那么你最好使用第一种形式。Felix是正确的,但是,数组可能有未定义的值,这可能会起到一定的作用
!!(item = items[i])