Muszę przejść przez obiekt JavaScript traktując go jako tablicę z niestandardowymi kluczami. Wiem, że nie jest to w pełni obsługiwane, ponieważ właściwości nie mają kolejności instruktażowej, ale ponieważ zawsze zmieniam właściwości, uważam to podejście za proste i niezawodne ... aż do teraz.
Problem występuje, gdy klucze są cyframi lub ciągami, które można rzutować jako liczby.
Kiedy uruchamiam ten kod:
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);}
dane wyjściowe to:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Co znaczy:
- (test1) jeśli klucze są mniejsze niż 2 ^ 32 (4 294 967 296), są one automatycznie porządkowane, najpierw najmniejsze
- (test2) jeśli klucze są powyżej 2 ^ 32, NIE zostaną ponownie uporządkowane.
Pytanie brzmi: dlaczego tak się dzieje?
Ponieważ wszystkie przeglądarki, które testowałem (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) są zgodne co do tego wyniku, musi istnieć jakaś oficjalna specyfikacja.
Aktualizacja
Przetestowałem wiele liczb, zanim odkryłem, że to kwestia progowa. Stwierdziłem dziwne, że sekwencja 2,3,1 zachowuje się inaczej niż trzy znaczniki czasu uporządkowane w ten sam sposób.
test1i test2. Myślę, że „problem” pochodzi z kluczowego buforowania w implementacji specyfikacji V8.
4294968333i 4294968111są większe niż 2 ** 32(co jest 4294967296). Nie są to więc tablice, więc są iterowane w kolejności tworzenia właściwości, a nie w kolejności rosnącej - to dokładnie to, co robią w skrzypcach, zgodnie z oczekiwaniami. (patrz moja odpowiedź)
