14

For...Inループは配列には推奨されないことをどこかで読みました(申し訳ありませんが、リンクが見つかりません)。ここで言われています: http://www.openjs.com/articles/for_loop.phpは連想配列用であり、http://www.w3schools.com/js/js_loop_for_in.aspは反復用ですオブジェクトのすべてのプロパティ (配列で使用できるとは言いません)。誰を信じていいのかわからない。私はこの問題が議論になることを望んでいません。予期しない副作用なしにコードでこれを使用できるかどうかを知りたいだけです。ありがとう!

4

4 に答える 4

21

配列はオブジェクトであり、配列要素は数値インデックスが文字列に変換された単純なプロパティです。たとえば、arr[123] は、配列オブジェクト arr のプロパティ「123」を参照します。

このfor ... in構文は、配列だけでなくすべてのオブジェクトで機能するため、混乱の原因になります。

誰かfor ... inが配列の場合、ほとんどの場合、プログラマーはすべての要素だけを繰り返し処理するつもりです。たとえば、配列が一連の数値を保持している場合、プログラマーはおそらく数値のストリームを反復するつもりです。セマンティクスは、他のプログラミング言語の配列反復と非常によく似ているため、非常に混乱しやすいです。

JavaScript では、この構造は配列要素を順番に反復しません。配列のすべてのプロパティ名(継承されたプロトタイプ関数の名前、それに追加されたプロパティ、追加されたその他の非要素プロパティなど) を反復し、順序どおりではありません。以前のブラウザーでは、プロパティも検出lengthされますが、最近のブラウザーでは、これらのプロパティはまさにこの理由で非表示になるように定義されています。

上記の整数の配列では、数値のストリームではなく、テキスト文字列のストリームが得られます。要素の値ではなく、プロパティの名前(任意の順序ではない単なる数値インデックスです)。プログラマーが別のプログラミング言語から来た場合、これはおそらくプログラマーが意味するものではありません。配列に格納されている要素がたまたま同様の数値である場合、誰もが混乱します。

それがあなたがそれをすべきではない理由です。当たり前のことをしているように見えて、実際にはまったく違うことをしている言語構造を使うべきではありません。非常に目立たず、見つけるのが非常に難しいバグを作成します。

于 2011-03-11T06:57:14.727 に答える
2

いくつかのブラウザー (FireFox 3、Opera 9、IE6、IE9 ベータ、Chrome) で配列反復をテストしましたが、正常に動作します。クロスブラウザーの非互換性を思い出すようですが、間違っているに違いありません。

ただし、まだ注意事項があります。

あなたが言及したように、for ... in構文はオブジェクトのプロパティを反復処理するために使用されます。したがって、配列では、その配列オブジェクトのすべてのプロパティも要素とともに反復されます。通常、配列オブジェクトにはその中のキーに対応するプロパティしかありませんが、別のスクリプトArray.prototype(フレームワークなど) が変更された場合、追加されたメソッド/属性も予期せず繰り返しに表示されます。

于 2011-03-11T06:40:34.737 に答える
0

を使用して配列を反復処理しても、for(... in ...)数値キーは取得されず、文字列値が取得されます。

プロトタイプで定義されたプロパティを取得するため、コードが拡張された場合Array、たとえば次のように実行します。

Array.prototype.each = ...;

次に、プロパティが表示されますeach

プロパティが配列インデックス順に取得されるという保証はありません。たとえば、繰り返してみてください

var arr = []
arr[1] = 1;
arr[0] = 0;

多くのブラウザでは10.

また、すべてのインデックスを取得できる保証はありません。繰り返してみてください

[0,,,3]

1インデックスまたはを取得できません2

于 2011-03-11T07:18:10.600 に答える