1

オブジェクトがそのプロパティを循環している場合:

var obj = {a: 1, b: 2, c: 3}

for (var prop in obj){
   console.log(obj[prop])
}

結果として、必然的に常に1、2、3になりますか?それは何に依存する可能性がありますか?他の結果は事実上本当ですか?

4

1 に答える 1

3

いいえ、オブジェクト プロパティの反復の順序に関して、言語には保証がありません。

MDNから:

for...in ループは、任意の順序でオブジェクトのプロパティを反復処理します (少なくともクロス ブラウザーの設定では、反復の見かけ上の規則性に依存できない理由については、delete 演算子を参照してください)。

ECMAScript はオブジェクトの反復順序を実装に依存させますが、すべての主要なブラウザは最初に追加されたプロパティに基づく反復順序をサポートしているように見えるかもしれません (少なくともプロトタイプにないプロパティの場合)。ただし、Internet Explorer の場合、プロパティで削除を使用すると、いくつかの紛らわしい動作が発生し、他のブラウザーがオブジェクト リテラルのような単純なオブジェクトを順序付けられた連想配列として使用できなくなります。エクスプローラーでは、プロパティ値が実際には未定義に設定されていますが、後で同じ名前のプロパティを再度追加すると、プロパティは元の位置で繰り返されます。プロパティを削除してから、再度追加しました。

したがって、クロスブラウザー環境で順序付けられた連想配列をシミュレートする場合は、2 つの別個の配列 (1 つはキー用、もう 1 つは値用) を使用するか、単一プロパティ オブジェクトの配列を作成する必要があります。 .

保証が必要な場合は、配列を使用する必要があります。必要に応じて、プロパティ キーを並べ替えて作成することもできます。

于 2013-03-19T09:35:55.690 に答える