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

JavaScript garantit-il l'ordre des propriétés des objets ?

<p>Si je crée un objet comme celui-ci : </p> <pre class="brush:php;toolbar:false;">var obj = {}; obj.prop1 = "Foo" ; obj.prop2 = "Barre";</pre> <p>L'objet généré ressemblera-t-il toujours à ceci ? </p> <pre class="brush:php;toolbar:false;">{ prop1 : "Foo", prop2 : "Bar" }</pre> <p> Autrement dit, les propriétés seront-elles dans le même ordre que celui dans lequel je les ai ajoutées ? </p>
P粉604848588P粉604848588427 Il y a quelques jours461

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

  • P粉894008490

    P粉8940084902023-08-21 15:38:37

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

    La plupart des navigateurs parcourent les propriétés des objets dans l'ordre suivant :

    1. Les clés entières positives sont triées par ordre croissant (ainsi que les chaînes comme "1" qui sont analysées en entiers)
    2. Les clés de chaîne sont dans l'ordre d'insertion (ES2015 le garantit et tous les navigateurs le respectent)
    3. Les noms des symboles sont dans l'ordre d'insertion (ES2015 le garantit et tous les navigateurs le respectent)

    Certains navigateurs plus anciens combinent la catégorie 1 et la catégorie 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 est conservé, mais le comportement des clés qui se résolvent en entiers positifs (tels que « 7 » ou « 99 ») varie selon les navigateurs. Par exemple, Chrome/V8 ne respecte pas 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.

    Veuillez noter que le comportement d'ES2015 est un bon exemple de spécifications de langage pilotées par le comportement existant, et non l'inverse. Pour un examen plus approfondi de cette façon de penser la rétrocompatibilité, consultez http://code.google.com/p/v8/issues/detail?id=164, une introduction détaillée à la conception du comportement de l'ordre d'itération de Chrome. Rapports de bogues Chrome pour la prise de décision. D'après l'un des commentaires (plutôt subjectifs) de ce rapport de bug :

    répondre
    0
  • P粉574695215

    P粉5746952152023-08-21 10:41:13

    L'ordre d'itération des objets suit certaines règles depuis ES2015, 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 :

    // 键的顺序:1, foo, bar
    const obj = { "foo": "foo", "1": "1", "bar": "bar" }

    Cela peut être mieux réalisé en utilisant un tableau ou un objet MapMap对象可以更好地实现这一点。 MapObject. Map présente certaines similitudes avec Object et est garanti pour itérer les clés dans l'ordre d'insertion, sans exceptions :

    Il est à noter qu'avant ES2015, l'ordre des propriétés dans un objet n'était pas du tout garanti. Définition d'objet de ECMAScript 3e édition (pdf)  :

    répondre
    0
  • Annulerrépondre