Devo passare in rassegna un oggetto JavaScript trattandolo come un array con chiavi personalizzate. So che questo non è completamente supportato, dal momento che le proprietà non hanno un ordine istruttivo, ma dal momento che riordino sempre le proprietà, ho trovato questo approccio semplice e affidabile ... fino ad ora.
Il problema si verifica quando le chiavi sono numeri o stringhe che possono essere espressi come numeri.
Quando eseguo questo codice:
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);}
l'output è:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Che significa:
- (test1) se i tasti sono inferiori a 2 ^ 32 (4.294.967.296), vengono automaticamente riordinati, il più piccolo per primo
- (test2) se i tasti sono superiori a 2 ^ 32, NON vengono riordinati.
La domanda è: perché sta succedendo questo?
Poiché tutti i browser che ho testato (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) concordano su questo output, ci devono essere alcune specifiche ufficiali.
Aggiornare
Ho testato molti numeri prima di scoprire che era una questione di soglia. Ho trovato strano che la sequenza 2,3,1 si comporti diversamente da tre timestamp ordinati allo stesso modo.
test1e test2. Penso che il "problema" provenga dalla memorizzazione nella chiave della chiave nell'implementazione V8 delle specifiche.
4294968333e 4294968111sono maggiori di 2 ** 32(che è 4294967296). Quindi, non sono indicazioni di array, quindi sono ripetute nell'ordine di creazione della proprietà, piuttosto che in ordine numerico crescente - che è esattamente quello che stanno facendo nel violino, come previsto. (vedi la mia risposta)
