Дополнительный контент для "Понимание спецификации ECMAScript, часть 2"
Почему o2.foo является AssignmentExpression?
o2.foo не выглядит как AssignmentExpression, так как нет присваивания. Почему он является AssignmentExpression?
Спецификация на самом деле позволяет AssignmentExpression как аргумент и как правую часть присваивания. Например:
function simple(a) {
console.log('Аргумент был ' + a);
}
simple(x = 1);
// → Выводит “Аргумент был 1”.
x;
// → 1
…и…
x = y = 5;
x; // 5
y; // 5
o2.foo является AssignmentExpression, который ничего не присваивает. Это следует из следующих грамматических правил, каждое из которых выбирает "самый простой" случай до последнего:
AssignmentExpression не обязательно должен содержать присваивание, он также может быть просто ConditionalExpression:
(Есть и другие правила, здесь мы показываем только релевантное.)
ConditionalExpression не обязательно должен содержать условие (a == b ? c : d), он также может быть просто ShortcircuitExpression:
И так далее:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression