Ordre d'initialisation et d'évaluation des objets Javascript

Si j'écris

var a = [1,2]; var b = { foo: a.pop(), bar: a.pop() }; 

Quelle est la valeur de b , selon la spécification?

(Par expérience, c'est {foo: 2, bar: 1} , mais je me demande si cela est spécifique à la mise en œuvre.)

Voir la section 11.1.5 d'ECMAScript définissant comment la production ObjectLiteral est analysée.

En particulier:

PropertyNameAndValueList , PropertyName : AssignmentExpression est évalué comme suit:

  1. Évaluez PropertyNameAndValueList.

  2. Évaluez PropertyName.

  3. Évaluez AssignmentExpression.

Où (1) est une définition récursive.

Cela signifie que l'élément le plus à gauche dans un littéral d'objet sera évalué en premier, et donc {foo: 2, bar: 1} est en effet spécifié.

Ils sont évalués dans l'ordre dans lequel ils sont écrits.