Инициализация объекта Javascript и порядок оценки
Если я напишу
var a = [1,2];
var b = {
foo: a.pop(),
bar: a.pop()
};
Какова стоимость b
согласно спецификации?
(Экспериментально это {foo: 2, bar: 1}
, но я волнуюсь, зависит ли это от реализации.)
2 ответа
См. Раздел ECMAScript 11.1.5, определяющий, как ObjectLiteral
производство разбирается.
Особенно:
PropertyNameAndValueList
,PropertyName
:AssignmentExpression
оценивается следующим образом:
Оцените PropertyNameAndValueList.
Оцените PropertyName.
Оценить AssignmentExpression.
...
Где (1) - рекурсивное определение.
Это означает, что самый левый элемент в литерале объекта будет оцениваться первым, и поэтому {foo: 2, bar: 1}
действительно специфицирован.