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
395

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ésressemblent 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, consultezhttp://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 suitun ensemble de règles spécifiques, maisil 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 objetMapMap object可能是实现此目的的更好方法。MapObjectpourrait être un meilleur moyen d'y parvenir.MapetObjectsont garantis pour itérer les clésdans 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 deECMAScript 3ème édition (pdf):

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!