Ich bemerkte, dass bestimmte Code, der einige Schuhgrößen für eine E-Commerce-Website bewertet und auf dem Bildschirm ausgibt, die Reihenfolge in Chrome versaut.Chrome Nachbestellen Objektschlüssel, wenn Numerik, ist das normal/erwartet
JSON kann gegeben sein:
{
"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"]
}
... die Größen in Hälften erhöht.
Bei der Umwandlung in ein Objekt und Iterieren obwohl der Schlüssel, die natürliche Ordnung eingehalten wird und sie kommt wie:
7, 7.5, 8, 8.5 usw.
Aber in Chrom nur, Tasten, die 'Look' wie runde Zahlen ALWAYS aus dem Objekt kommen zuerst, so Ausgang einer for ... in Schleife ist:
7, 8, 9, 7. 5, 8.5, 9.5 ...
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
Hier ist der Testfall: https://jsfiddle.net/wcapc46L/1/
Es nur ganze Zahlen beeinflusst ist, scheint wie Webkit/Blink eine Optimierung, die Objekteigenschaften bevorzugt, die numerisch, vielleicht ist es mit der Branch Prediction oder was auch immer zu tun.
Wenn Sie die Objektschlüssel mit einem beliebigen Zeichen Präfix, bleibt die Reihenfolge nicht betroffen und funktioniert wie beabsichtigt - FIFO
Ich glaube, ich erinnere lesen, dass es keine Garantien in der Größenordnung von Eigenschaften eines Objekts, aber gleichzeitig Diese Zeit ist extrem ärgerlich und würde einen erheblichen Aufwand bei der Behebung von Chrome-Benutzern verursachen.
Irgendwelche Ideen? ist das wahrscheinlich ein Bug, der behoben wird?
bearbeiten zusätzlich habe ich entdeckt, jetzt dies als ein Problem auf dem Tracker v8 Fehler:
http://code.google.com/p/v8/issues/detail?id=164
wie Blink Sieht nicht will, dies zu beheben und den einzigen Browser bleiben, das wird TU es.
Update was Hash-Tabelle Optimierung webkit/blink hatte, hat nun seinen Weg in Gecko (FF 27.0.1) gemacht - http://jsfiddle.net/9Htmq/ Ergebnisse in
7,8,9,7.5,8.5,9.5
. Anwendung_
, bevor die Schlüssel die richtige/erwartete Reihenfolge zurückgibt.Update 2017 Menschen sind immer noch upvoting und bearbeite diese so - es ist nicht
Map
/WeakMap
,Set
usw. zu beeinflussen scheint (wie durch aktualisierte Haupt Beispiel gezeigt)
+1 für einen Testfall. – spender
Ich denke, Sie müssen hier Ihre Methode der Planung neu anordnen. Wenn Sie * gelesen * haben, dass die Reihenfolge nicht definiert ist, warum beschweren Sie sich, dass Sie viel Code reparieren müssen, wenn Sie jetzt diese * Überraschungsüberraschung * entdecken, es ist undefiniert? Dies ist kein Fehler, der behoben wird. Anders gesagt, der Fehler befindet sich in Ihrem Code, Sie haben sich auf Implementierungsdetails verlassen und nicht auf dokumentiertes Verhalten. Korrigieren Sie Ihren Code. –
zum Zeitpunkt der Entwicklung, Chrom war nicht annähernd und es beläuft sich jetzt auf 7% der Website-Nutzer. bis chrome kam, funktionierte es wie geplant in allen browsern, inklusive safari - also kein webkit-problem.und ja, ich verstehe, dass es Refactoring benötigt, aber hoffte auf eine einfachere Lösung (oder dass Chrome wird dies tatsächlich reparieren wie jeder andere). Für den Moment muss ich vielleicht allen Objekteigenschaften mit __ oder etwas vorangestellt werden, um die natürliche Reihenfolge der Definition zu erzwingen. –