L'ordine delle proprietà negli oggetti normali è un argomento complesso in Javascript.
Mentre in ES5 esplicitamente non è stato specificato alcun ordine, ES2015 ha un ordine in alcuni casi. Dato è il seguente oggetto:
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},
});
Ciò si traduce nel seguente ordine (in alcuni casi):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- chiavi di tipo intero in ordine crescente
- chiavi normali in ordine di inserimento
- Simboli in ordine di inserimento
Pertanto, ci sono tre segmenti, che possono alterare l'ordine di inserimento (come è successo nell'esempio). E le chiavi di tipo intero non si attengono affatto all'ordine di inserimento.
La domanda è: per quali metodi questo ordine è garantito nelle specifiche ES2015?
I seguenti metodi garantiscono l'ordine mostrato:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
I seguenti metodi / loop non garantiscono alcun ordine:
- Object.keys
- for..in
- JSON.parse
- JSON.stringify
Conclusione: anche in ES2015 non dovresti fare affidamento sull'ordine delle proprietà degli oggetti normali in Javascript. È soggetto a errori. Usa Map
invece.