0

以下の JavaScript コード:-

var a  = [];
for (i in a) {
  alert(i);

}

$family、$constuctor、each、clone、clean、invoke、associate、link、contains、append、getlast、getRandom、include、combine、erase、empty、flatten、pick、hexToRgb、rgbToHex として o/p を取得しています。

その理由を誰か説明できますか?配列オブジェクトのプロパティで何かをしなければならないのですか?もしそうなら、なぜすべてのプロパティが警告されないのですか? また、 var a = {} のような空のオブジェクト リテラルを取得すると、o/p は取得されません。

さて、上記のコードを次のように変更すると:-

var a  = [9,2];
for (i in a) {
    if (a.hasOwnProperty(i)) {
        alert(a.hasOwnProperty(i));
        alert(i);
      }
} 

出力が 0 と 1 になるのはなぜですか? これらはこの Array オブジェクトのプロパティですか (インデックスでもあります)?

4

1 に答える 1

3

for-in 構文はオブジェクト用です。メソッドを含むオブジェクトのすべてのフィールドを繰り返します。配列を反復したいときは、常にこれを使用してください:

for (var i = 0; i < array.size; i++) {
    doSomething(array[i]);
}

後者のループhasOwnPropertyは、配列の標準メソッドを反復処理しません。これは、配列aが基本 Array クラスからこれらのメソッドを継承しているため、独自のプロパティではないためです。ただし、メソッドを明示的に配列に追加すると、独自のプロパティになるため、関数もリストする必要があります。

var a  = [9,2];
a.hello = function() { };

for (i in a) {
    if (a.hasOwnProperty(i)) {
        alert(a.hasOwnProperty(i));
        alert(i);
      }
} 

これには、0、1、および hello が表示されます。

9 と 2 を出力すると予想していたのに、なぜ 0 と 1 を出力するのか疑問に思った場合: これは、for-in 配列が値ではなくキーを反復処理するためです。また、配列は基本的にオブジェクトであり、各配列要素は名前として配列インデックスを持つプロパティです。そう

var a = [9, 2];

このオブジェクト (および Array から継承されたもの) と同等です。

var a = {
    0: 9,
    1: 2
}
于 2012-10-01T13:45:12.077 に答える