4

どこかは覚えていませんがfor..in、ループの実行ごとに順方向、逆方向、ランダム、または順方向と逆方向を交互に繰り返すなど、実装者が好む任意の順序でループが要素を通過できると書かれているのを見たことがありfor..inます。しかし、実際には、どういうわけか、後者が実際に存在する実装には当てはまらないと思います。(ただし、物事を台無しにするのが好きな特定のブラウザーが存在するため、確信は持てませんが、余談になります。)

私が言いたいのは、実際にはシーケンス処理にそれほど悪い偏差はおそらくないのfor..inですが、ECMAScript の実装間に偏差があるとすれば、どのような偏差があるかを知りたいということです。主なものは、JScript、Chakra、Futhark、Carakan、JavascriptCore、SquirrelFish、V8、SpiderMonkey、TraceMonkey になると思いますが、参考までに。

4

1 に答える 1

5

まず、列挙の順序に関する仕様からの参照を次に示します。

12.6.4 for-in ステートメント

プロパティを列挙するメカニズムと順序 (最初のアルゴリズムのステップ 6.a、2 番目のアルゴリズムのステップ 7.a) は指定されていません。列挙されているオブジェクトのプロパティは、列挙中に削除される場合があります。列挙中にまだ訪問されていないプロパティが削除された場合、そのプロパティは訪問されません。列挙中に列挙されているオブジェクトに新しいプロパティが追加された場合、新しく追加されたプロパティがアクティブな列挙でアクセスされるとは限りません。プロパティ名は、列挙内で複数回アクセスしてはなりません。

私が手に負えないと思うことができるのはこれらだけです:

  • IE の以前の(おそらく現在の?)バージョンは、列挙中に追加された新しいプロパティを列挙の最後に配置し、現在実行中のプロパティがアクセスできるようにします。for-in

  • V8 では、WorkingAsIntendedとしてクローズされたこのバグ レポートで説明されているように、列挙の順序が異なります。

     var a = {"foo":"bar", "3": "3", "2":"2", "1":"1"};
    

    Firefox と V8 でのテストでは、順序が異なります。

これは大したリストではありません。確かにもっとあるかもしれません。@Pointy のコメントで要約されていると思います。保証はありません。一貫した方法で確実に列挙するオブジェクトがある場合でも、次のバージョン アップグレードで列挙されるとは限りません。ツールは、単に機能しているように見えるものではなく、指定どおりに機能するように使用してください。

于 2012-11-18T14:46:51.957 に答える