El orden de las propiedades en los objetos normales es un tema complejo en Javascript.
Mientras que en ES5 explícitamente no se ha especificado ningún pedido, ES2015 tiene un pedido en ciertos casos. Dado es el siguiente objeto:
o = Object.create(null, {
m: {value: function() {}, enumerable: true},
"2": {value: "2", enumerable: true},
"b": {value: "b", enumerable: true},
0: {value: 0, enumerable: true},
[Symbol()]: {value: "sym", enumerable: true},
"1": {value: "1", enumerable: true},
"a": {value: "a", enumerable: true},
});
Esto resulta en el siguiente orden (en ciertos casos):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- teclas de tipo entero en orden ascendente
- claves normales en orden de inserción
- Símbolos en orden de inserción
Por lo tanto, hay tres segmentos que pueden alterar el orden de inserción (como sucedió en el ejemplo). Y las teclas de tipo entero no se adhieren al orden de inserción en absoluto.
La pregunta es, ¿para qué métodos está garantizado este pedido en la especificación ES2015?
Los siguientes métodos garantizan el orden que se muestra:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
Los siguientes métodos / bucles no garantizan ningún orden en absoluto:
- Object.keys
- por..in
- JSON.parse
- JSON.stringify
Conclusión: incluso en ES2015 no debe confiar en el orden de las propiedades de los objetos normales en Javascript. Es propenso a errores. Usar en su Map
lugar.