Инициализация и оценка объекта JavaScript

Если я пишу

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

Каково значение b, согласно спецификации?

(В эксперименте он {foo: 2, bar: 1}, но я беспокоюсь, является ли это специфичным для реализации.)

Ответ 1

См. раздел 11.1.5 ECMAScript, определяющий способ обработки ObjectLiteral.

В частности:

PropertyNameAndValueList, PropertyName: AssignmentExpressionоценивается следующим образом:

  • Оценить свойствоNameAndValueList.

  • Вычислить имя свойства.

  • Вычислить присвоение.

...

Где (1) - рекурсивное определение.

Это означает, что самый левый элемент в литерале объекта сначала оценивается, поэтому {foo: 2, bar: 1} действительно специфицирован.

Ответ 2

Они оцениваются в том порядке, в котором они записаны.