2

現在、コードで 2 種類の反復を使用しています。

オブジェクトの場合 (スニペット 1):

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        // do stuff with key and obj[key]
    }
}

配列の場合 (スニペット 2):

for (var i=0, count=arr.length;i<count;i++) {
    // do stuff with i and arr[i]
}

コードを簡素化し、オブジェクトと配列の両方に 1 つの関数を使用したいと考えています (スニペット 3):

var keys=Object.keys(arrorobj);
for (var i=0, count=keys.length;i<count;i++) {
    // do stuff with keys[i] and arrorobj[keys[i]]
}

スニペット 3 がオブジェクトに適していることはわかっていますが、配列でも期待どおりに機能し、スニペット 1 と 2 の両方を置き換えますか? 特に、すべてのブラウザー (少なくとも Object.keys をサポートするブラウザー) で、スニペット 3 がキーの順序 (インデックス 0 から上) を尊重することを保証できますか?

[編集] 特にオブジェクトの深いマージにこれを使用する予定です。私の現在のコードは、各レベルでタイプ (配列、オブジェクト、またはその他) に応じて 3 つの分岐があるため、重いです。

4

1 に答える 1

1

配列の唯一の列挙可能なプロパティが番号付きスロット ( an のデフォルトArray) である間は機能しますが、返されるプロパティの順序は保証されfor ( in )ません。常に数値的に反復するとは限りません (プロパティがどのように割り当てられたかによって異なります)。

別のプロパティを割り当てた場合、それも列挙されます (これは、より標準的な反復手法では発生しません)。

また、ループがこれらを反復するため、空のスロット (例: new Array(25))に対してもまったく同じように動作しません。for

通常for、配列、またはforEach()メソッド (または関連) にはループを使用することをお勧めします。

于 2013-02-01T00:33:11.290 に答える