L'ordre des propriétés des objets est-il garanti en JavaScript ?
P粉663883862
P粉663883862 2023-10-12 20:05:36
0
2
478

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 ?

P粉663883862
P粉663883862

répondre à tous(2)
P粉006977956

Oui (mais pas toujours dans l'ordre d'insertion).

La plupart des navigateurs parcourent les propriétés des objets comme :

  1. Clés entières positives par ordre croissant (et chaînes comme "1" analysées en entiers)
  2. Clés de chaîne, dans l'ordre d'insertion (ES2015 le garantit et tous les navigateurs le respectent)
  3. Noms des symboles, dans l'ordre d'insertion (ES2015 le garantit et tous les navigateurs le respectent)

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 :

P粉541565322

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 :

// key order: 1, foo, bar
const obj = { "foo": "foo", "1": "1", "bar": "bar" }

Utiliser un tableau ou un objet MapMap object 可能是实现此目的的更好方法。 MapObject pourrait être un meilleur moyen d'y parvenir. Map et Object 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) :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal