Ich muss ein JavaScript-Objekt durchlaufen, das es als Array mit benutzerdefinierten Schlüsseln behandelt. Ich weiß, dass dies nicht vollständig unterstützt wird, da Eigenschaften keine instrumentelle Reihenfolge haben, aber da ich die Eigenschaften immer neu ordne, fand ich diesen Ansatz einfach und zuverlässig ... bis jetzt.
Das Problem tritt auf, wenn die Schlüssel Zahlen oder Zeichenfolgen sind, die als Zahlen umgewandelt werden können.
Wenn ich diesen Code ausführe:
var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}
Die Ausgabe ist:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Was bedeutet:
- (test1) Wenn die Tasten unter 2 ^ 32 (4,294,967,296) liegen, werden sie automatisch neu angeordnet, die kleinste zuerst
- (test2) Wenn die Tasten über 2 ^ 32 liegen, werden sie NICHT neu angeordnet.
Die Frage ist: Warum passiert das?
Da alle von mir getesteten Browser (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) dieser Ausgabe zustimmen, muss es einige offizielle Spezifikationen geben.
Aktualisieren
Ich habe viele Zahlen getestet, bevor ich herausgefunden habe, dass es sich um eine Schwellenfrage handelt. Ich fand es seltsam, dass sich die Sequenz 2,3,1 anders verhält als drei Zeitstempel, die auf die gleiche Weise bestellt wurden.
test1und sehen test2. Ich denke, das "Problem" liegt im Schlüssel-Caching in der V8-Implementierung der Spezifikation.
4294968333und 4294968111sind größer als 2 ** 32(das ist 4294967296). Sie sind also keine Array-Angaben, daher werden sie in der Reihenfolge der Eigenschaftserstellung und nicht in aufsteigender numerischer Reihenfolge wiederholt - genau das tun sie erwartungsgemäß in der Geige. (siehe meine Antwort)
