配列とオブジェクトを混同したのはあなたが初めてではありません。SOには、この種の質問に対するFAQが含まれている必要があります;)
物事を説明しようとしましょう:
配列は値の行であり、行内の位置を使用して取得できます。配列値の順序は固定されています (並べ替えることができます)。
オブジェクトは、キーと値のペアの形式で名前付きプロパティを含む変数です。オブジェクトに属するキーと値のペアの順序は任意です。
配列は次のようになります[ 'first', 'second', 'third', ..., 'nth' ]
。 オブジェクトは次のようになります。{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }
配列の最初の要素は、インデックス 0 の要素です (つまり、行の最初の位置のインデックス値は 0 です)。を使用して取得しますmyArray[0]
オブジェクトは順序付けされていないため、最初の要素はありません。myObject.somekey
またはを使用して、要素を取得しますmyObject['somekey']
。
配列の場合、配列の最後に到達するまで番号付きインデックスを反復するループを使用します。
var i=0, len = myArray.length;
for ( i; i<len; i++ ) {
//do something with >>> myArray[i] <<<
}
オブジェクトの場合、キーと演算子を使用してループを使用します(メソッドin
でオブジェクトのユーザー定義プロパティのみを取得していることを確認してください)。.hasOwnAttribute
for ( var key in myObject ){
if (myObject.hasOwnProperty(key)) {
// do something with >>> myObject[key] <<<
}
}
基本的に、配列は、それぞれに値が含まれる引き出し付きの食器棚と考えてください。オブジェクトは、箱の中身を説明するステッカーが蓋に貼られた箱の山として想像できます。オブジェクトから何かを取得するとき、次のように尋ねます: x の山に y のステッカーが貼られた箱はありますか。配列から何かを取得するとき、次のように尋ねます:引き出し nr x の内容を教えてください。
あなたの質問について:ループで値を取得している配列にfor..in
は、ユーザー定義のメソッド、つまり が含まれていますindexOf
。それにオブジェクト スタイル ループを使用すると、配列はオブジェクトとして扱われ、indexOf
キー (function(){...}
きっと値付き) も表示されます。IE そのため、配列を反復処理する場合は、従来の for ループと数値インデックスを使用する方がよい場合があります。
これが IE だけにあるのはなぜですか? 最新のブラウザーindexOf
では、Array
プロトタイプのネイティブ メソッドであり、ネイティブ メソッドは表示されません (プロトタイプをループしない限り)。IE < 9 には、配列用のネイティブの indexOf メソッドがありません。メソッドを使用するスクリプトのどこかで、ユーザー定義の拡張機能として Array プロトタイプに追加されています。
for ... in
問題の結論:配列の値をループするために使用しないでください。