J'ai besoin de parcourir un objet JavaScript en le traitant comme un tableau avec des clés personnalisées. Je sais que cela n'est pas entièrement pris en charge, car les propriétés n'ont pas d'ordre intrinsèque, mais comme je réorganise toujours les propriétés, j'ai trouvé cette approche simple et fiable ... jusqu'à présent.
Le problème se produit lorsque les clés sont des nombres ou des chaînes pouvant être converties en nombres.
Lorsque j'exécute ce code:
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);}
la sortie est:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Ce qui signifie:
- (test1) si les touches sont inférieures à 2 ^ 32 (4 294 967 296), elles sont automatiquement réorganisées, la plus petite en premier
- (test2) si les touches sont supérieures à 2 ^ 32, elles ne sont PAS réorganisées.
La question est: pourquoi cela se produit-il?
Étant donné que tous les navigateurs que j'ai testés (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) sont d'accord sur cette sortie, il doit y avoir des spécifications officielles.
Mise à jour
J'ai testé beaucoup de chiffres avant de découvrir que c'était une question de seuil. J'ai trouvé étrange que la séquence 2,3,1 se comporte différemment de trois horodatages ordonnés de la même manière.
test1et test2. Je pense que le "problème" vient de la mise en cache des clés dans la mise en œuvre V8 de la spécification.
4294968333et 4294968111sont supérieures à 2 ** 32(ce qui est 4294967296). Donc, ce ne sont pas des indices de tableau, ils sont donc itérés dans l'ordre de création des propriétés plutôt que dans l'ordre numérique croissant - ce qui est exactement ce qu'ils font au violon, comme prévu. (voir ma réponse)
