0

次のように、JavaScriptで配列のキーを出力しようとしています:

data=[8, 4, 6, 9, 5, 2, 4, 6];
for(i in data){console.log(i);}

ただし、キーを出力するだけでなく、次のように出力します。

0
1
2
3
4
5
6
7
$family
each
clean
associate
link
contains
extend
getLast
getRandom
include
combine
erase
empty
flatten
hexToRgb
rgbToHex
min
max
average
sum
unique
shuffle

なんで?また、配列キーを出力した後に停止するにはどうすればよいですか?

4

3 に答える 3

2

代わりに「通常の」forループを使用します。

for(var i = 0; i < data.length; i++) {
    console.log(data[i]);
}

JavaScript のfor...inコンストラクトは、オブジェクトのすべてのプロパティを反復処理するため、すべてのプロパティ/メソッドArray.prototype(実際には、プロトタイプ チェーンのずっと上まで行く) と、期待する要素を取得します。

于 2011-12-20T00:27:49.730 に答える
1

これは、配列がオブジェクトであり、for-in が配列インデックスではなくプロパティを反復するためです。これを行うこともできます:data.forEach(function(a,i){console.log(i);})または、プロパティを調べて、それらが Array.prototype に「含まれている」かどうかを確認することもできます

于 2011-12-20T00:27:10.050 に答える
1

ループは、オブジェクトのfor..inすべての列挙可能なプロパティを通過します。これらすべての余分なプロパティが配列でどのように定義されるようになったのかわかりません-それらを追加するライブラリを使用していますArray.prototypeか?

従来の for ループを使用して、配列の数値的にインデックス付けされた項目を処理する必要があります。これにより、他のプロパティは自動的に無視されます。インデックスを出力したいだけの場合は、次のようになります。

for (var i=0; i < data.length; i++) {
   if (typeof data[i] !== "undefined")
      console.log(i);
}

定義された最高のインデックスよりも 1 つ高い値を返すことに注意してください。ただし.length、すべての下位インデックスに実際に値が含まれているわけではないため、各項目が未定義ではないことを確認するようにしました。undefined が配列の有効な値である場合は削除できます-実際には、「穴」のある配列を使用することはめったにありませんが、完全を期すために言及しています。

PS を使用できます.forEach()が、古いブラウザではサポートされていません。

于 2011-12-20T00:29:26.720 に答える