Eu preciso percorrer um objeto JavaScript tratando-o como uma matriz com chaves personalizadas. Eu sei que isso não é totalmente suportado, já que as propriedades não têm ordem instrínseca, mas como eu sempre reorganizo as propriedades, achei essa abordagem simples e confiável ... até agora.
O problema ocorre quando as teclas são números ou cadeias que podem ser convertidas como números.
Quando executo esse código:
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);}
a saída é:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Que significa:
- (test1) se as chaves estiverem abaixo de 2 ^ 32 (4.294.967.296), elas serão reordenadas automaticamente, a menor primeira
- (test2) se as chaves estiverem acima de 2 ^ 32, elas NÃO serão reordenadas.
A questão é: por que isso está acontecendo?
Como todos os navegadores que testei (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) concordam com essa saída, deve haver alguma especificação oficial.
Atualizar
Testei muitos números antes de descobrir que era uma questão de limiar. Achei estranho que a sequência 2,3,1 se comporte de maneira diferente de três registros de data e hora ordenados da mesma maneira.
test1e test2. Eu acho que o "problema" é do cache de chaves na implementação da especificação V8.
4294968333e 4294968111são maiores que 2 ** 32(o que é 4294967296). Portanto, eles não são indicações de matriz, portanto são iterados em ordem de criação de propriedade, em vez de em ordem numérica crescente - que é exatamente o que eles estão fazendo no violino, como esperado. (veja minha resposta)
