4

Im just wondering the difference between these array iterations, and why the second one seems to be really rarely used, is something wrong with it?

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

The second way:

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

3 に答える 3

9

最初のものは、すべての要素を常に反復することが保証されています。

2 つ目は、0 などの false のような要素に遭遇すると、途中で停止します。

于 2012-10-18T18:16:40.737 に答える
1

2番目のforループでは、i変数を初期化する必要があります。

検討:

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

最初のループはアレイ全体をループします。ただし、2番目のループの条件は、アイテムに割り当てられた値を評価します。この部分のブール値は次のようになります。

!!(item = items[i])

null0false""(空の文字列)undefinedなどの有効な値は、falseと評価されて壊れます。上記の配列では、アイテムがfalseに割り当てられると、forループから抜け出します。

于 2012-10-18T18:26:56.560 に答える
0

2番目のケースでは、終了条件はややjavascript固有です。ブール値に変換された代入がfalseを生成するとループが終了します。これは、配列要素をその範囲外に読み取るときにも発生します。これは、配列へのアウトオブバウンスアクセスが何らかのエラーを引き起こし、forループを終了するための正しい条件を保証しない他の一般的な言語とは対照的です。javascript以外の言語のバックグラウンドを持つプログラマーが反復ループを作成するとき、彼/彼女はおそらく、これらの言語で正しくない、あるいは危険でさえあると知っているパターンを避けます。

これが主な理由だと思います。しかし、他のことは、上記のように、反復配列の終わりに達する前でもこの条件がfalseになる可能性があることです。たとえば、割り当てられた要素の値がfalse 、0、またはjavascriptで暗黙的にfalseに変換されるその他の値である場合です。

于 2012-10-18T18:25:57.390 に答える