Necesito recorrer un objeto JavaScript tratándolo como una matriz con claves personalizadas. Sé que esto no es totalmente compatible, ya que las propiedades no tienen un orden intrínseco, pero dado que siempre vuelvo a ordenar las propiedades, encontré este enfoque simple y confiable ... hasta ahora.
El problema ocurre cuando las teclas son números o cadenas que se pueden convertir como números.
Cuando ejecuto este 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);}
la salida es:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Lo que significa:
- (prueba1) si las teclas están por debajo de 2 ^ 32 (4,294,967,296), se reordenan automáticamente, la más pequeña primero
- (test2) si las claves están por encima de 2 ^ 32, NO se reordenan.
La pregunta es: ¿por qué está sucediendo esto?
Dado que todos los navegadores que probé (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) están de acuerdo con esta salida, debe haber alguna especificación oficial.
Actualizar
Probé muchos números antes de descubrir que era una cuestión de umbral. Encontré extraño que la secuencia 2,3,1 se comporte de manera diferente a tres marcas de tiempo ordenadas de la misma manera.
test1y test2. Creo que el "problema" proviene del almacenamiento en caché de claves en la implementación V8 de la especificación.
4294968333y 4294968111son mayores que 2 ** 32(que es 4294967296). Por lo tanto, no son indicadores de matriz, por lo que se repiten en orden de creación de propiedad, en lugar de en orden numérico ascendente, que es exactamente lo que están haciendo en el violín, como se esperaba. (ver mi respuesta)
