Si je crée un objet comme celui-ci :
var obj = {}; obj.prop1 = "Foo"; obj.prop2 = "Bar";
Est-ce que les objets générés ressemblent toujours à ceci ?
{ prop1 : "Foo", prop2 : "Bar" }
Autrement dit, les propriétés sont-elles dans le même ordre que celui dans lequel je les ai ajoutées ?
Oui (mais pas toujours dans l'ordre d'insertion).
La plupart des navigateurs parcourent les propriétés des objets comme :
Certains navigateurs plus anciens combinent les catégories n°1 et n°2, en parcourant toutes les clés dans l'ordre d'insertion. Si vos clés sont susceptibles de se résoudre en nombres entiers, il est préférable de ne pas s'appuyer sur un ordre d'itération particulier.
Spécification actuelle du langage (à partir de ES2015) L'ordre d'insertion sera conservé, à l'exception des clés qui se résolvent en entiers positifs (par exemple "7" ou "99"), auquel cas les navigateurs se comporteront différemment. Par exemple, Chrome/V8 ne prend pas en compte l'ordre d'insertion lorsque les clés sont résolues en nombres.
Ancienne spécification du langage (avant ES2015) : l'ordre d'itération est techniquement indéfini, mais tous les principaux navigateurs adhèrent au comportement ES2015.
Notez que le comportement ES2015 est un bon exemple de spécifications de langage pilotées par le comportement existant, et non l'inverse. Pour une compréhension plus approfondie de la mentalité de compatibilité ascendante, consultez http://code.google.com/p/v8/issues/detail?id=164, un bug de Chrome qui détaille le comportement derrière les décisions de conception de l'ordre d'itération de Chrome. D'après l'un des commentaires (plutôt opiniâtres) sur le rapport de bug :
Depuis ES2015, l'ordre d'itération des objets suit un ensemble de règles spécifiques, mais il ne suit pas (toujours) l'ordre d'insertion. En termes simples, l'ordre d'itération est une combinaison de l'ordre d'insertion pour les clés de chaîne et de l'ordre croissant pour les clés de type numérique :
Utiliser un tableau ou un objet
Map
可能是实现此目的的更好方法。Map object
Map
与Object
pourrait être un meilleur moyen d'y parvenir.Map
etObject
sont garantis pour itérer les clés dans l'ordre d'insertion, sans exception :Il est à noter qu'avant ES2015, l'ordre des propriétés dans un objet n'était pas du tout garanti. La définition d'objet provient de ECMAScript 3ème édition (pdf) :