4

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

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
}
4

3 回答 3

9

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

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

于 2012-10-18T18:16:40.737 回答
1

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

考虑:

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

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

!!(item = items[i])

有效值,如null0false""(空字符串)undefined将评估为 false 并中断。在上面的数组中,当 item 被赋值为false时,您将跳出 for 循环

于 2012-10-18T18:26:56.560 回答
0

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

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

于 2012-10-18T18:25:57.390 回答