Дополнительный контент для "Понимание спецификации 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