Maison  >  Questions et réponses  >  le corps du texte

L'ordre des propriétés des objets est-il garanti en JavaScript ?

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粉663883862P粉663883862373 Il y a quelques jours452

répondre à tous(2)je répondrai

  • P粉006977956

    P粉0069779562023-10-13 16:31:53

    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 :

    répondre
    0
  • P粉541565322

    P粉5415653222023-10-13 14:55:26

    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 Map< /code>Map< /code> 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) :

    répondre
    0
  • Annulerrépondre