43

JavaScriptでは、穴のある配列を作成できます。

a = [];
a[0] = 100;
a[5] = 200;
a[3] = 300;

a.forEach(function(x) {alert(x);});

要素が昇順で処理されるかどうか、またはこれは信頼できる事実ではないかどうかについての情報を見つけることができませんでした。

「for..in」ループが配列インデックスを昇順でトラバースする一方で、オブジェクトのプロパティ名がオブジェクトに追加されたのと同じ順序でトラバースされることを確認しました(少なくともそのように見えます)。

(つまり、配列は内部的にある種のツリーであり、オブジェクトはハッシュテーブルであるように見えます。)

Rhino JavaScriptが存在しない要素もトラバースすることがわかりました:http: //ideone.com/7Z3AFh(for..inとは異なります)。

4

3 に答える 3

71

ECMA-262、第5版の仕様、およびMDNのArray.forEach()ページはどちらも、のアルゴリズムを示しており.forEach()、配列要素をインデックスの昇順で確実に反復します(値が割り当てられなかったインデックスをスキップします)。

もちろん、一部のブラウザはそのアルゴリズムを適切に実装していない可能性がありますが、そうでないものはありません。

于 2012-11-28T08:46:16.173 に答える
15

仕様による forEachと、配列要素は番号順にアクセスします。存在しない要素にはアクセスしません。詳細については、リンクを参照してください。したがって、例の配列では、要素0、次に3、、の順にアクセスします5。それらを配列に追加する順序は、それらがアクセスされる順序には影響しません。

「for..in」ループが配列インデックスを昇順でトラバースする一方で、オブジェクトのプロパティ名がオブジェクトに追加されたのと同じ順序でトラバースされることを確認しました(少なくともそのように見えます)。

ES2015がオブジェクトプロパティの順序を定義しているにもかかわらず、ES2015(別名ES6)でも、オブジェクトプロパティにアクセスする順序は仕様によって定義されてfor-inません。その順序は、または に適用されません。(これについては、この回答で詳しく説明します。)ES2015で定義された順序でプロパティにアクセスする場合は、 (名前で定義されていないプロパティの場合)または(両方と文字列のプロパティ名の場合[数値のプロパティ名は本当に文字列])。どちらもプロパティの順序を尊重します。for-inObject.keysObject.getOwnPropertyNamesSymbolReflect.ownKeysSymbol

于 2012-11-28T08:45:47.053 に答える
4

ECMAScript標準から直接

forEachは、配列に存在する要素ごとに昇順で1回callbackfnを呼び出します。callbackfnは、実際に存在する配列の要素に対してのみ呼び出されます。配列の欠落している要素に対しては呼び出されません。

したがって、Array.forEachは配列内の特定の要素をスキップします。あなたの例

a.forEach( function( value ) { console.log( value ) }); // prints 100, 300, 200

配列を昇順でトラバースする必要があり、すべての要素が数値である場合は、次のように事前に配列を並べ替えることができます。

a.sort( function( a, b ) { return a - b });
// this now prints 100, 200, 300
a.forEach( function( value ) { console.log( value ) }); 
于 2012-11-28T08:42:39.587 に答える