L'ordre des propriétés dans les objets normaux est un sujet complexe en Javascript.
Alors que dans ES5 explicitement aucune commande n'a été spécifiée, ES2015 a une commande dans certains cas. Étant donné l'objet suivant:
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},
});
Il en résulte l'ordre suivant (dans certains cas):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- clés de type entier dans l'ordre croissant
- clés normales dans l'ordre d'insertion
- Symboles dans l'ordre d'insertion
Ainsi, il y a trois segments, qui peuvent modifier l'ordre d'insertion (comme cela s'est produit dans l'exemple). Et les clés de type entier ne respectent pas du tout l'ordre d'insertion.
La question est de savoir pour quelles méthodes cette commande est garantie dans la spécification ES2015.
Les méthodes suivantes garantissent l'ordre indiqué:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
Les méthodes / boucles suivantes garantissent aucun ordre du tout:
- Object.keys
- for..in
- JSON.parse
- JSON.stringify
Conclusion: Même dans ES2015, vous ne devez pas vous fier à l'ordre des propriétés des objets normaux en Javascript. Il est sujet aux erreurs. Utilisez Map
plutôt.