e コマース サイトで靴のサイズを評価して画面に出力する特定のコードが、Chrome で順序を乱していることに気付きました。
指定できる JSON は次のとおりです。
{
"7": ["9149", "9139", "10455", "17208"],
"7.5": ["9140", "9150", "10456", "17209"],
"8": ["2684", "9141", "10457", "17210"],
"8.5": ["9142", "10444", "10458", "17211"],
"9": ["2685", "9143", "10459", "17212"],
"9.5": ["10443", "9144", "10460", "17213"]
}
...サイズを半分に増やします。
オブジェクトに変換してキーを反復すると、自然順序が尊重され、次のようになります。
7、7.5、8、8.5など
ただし、Chrome のみでは、丸数字のように「見える」キーは常に最初にオブジェクトから出てくるため、for... in ループの出力は次のようになります。
7、8、9、7.5、8.5、9.5 ...
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
テストケースは次のとおりです: https://jsfiddle.net/wcapc46L/1/
整数にのみ影響します。Webkit / Blink には、数値のオブジェクト プロパティを優先する最適化があるようです。おそらく、分岐予測などに関係しています。
オブジェクト キーの前に任意の文字を付けても、順序は影響を受けず、意図したとおりに機能します - FIFO
オブジェクトのプロパティの順序に保証がないことを読んだことを覚えていると思いますが、同時に、これは極端に面倒であり、クロムユーザーだけで修正するにはかなりの労力が必要になります.
何か案は?これはおそらく修正されるバグですか?
さらに編集して、v8バグトラッカーの問題としてこれを発見しました:
https://code.google.com/p/v8/issues/detail?id=164
Blink はこれを修正したくないようで、修正できる唯一のブラウザであり続けるでしょう。
ハッシュテーブルの最適化 webkit/blink が持っていたものを更新すると、現在 gecko (FF 27.0.1) に組み込まれています - https://jsfiddle.net/9Htmq/結果は
7,8,9,7.5,8.5,9.5
._
キーが正しい/予想される順序を返す前に適用します。update 2017人々はまだこれを支持して編集しているので、
Map
/などには影響しないようです(更新されたメインの例で示されているように)WeakMap
Set