Дополнительный контент для "Понимание спецификации 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
Почти готово…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
Не отчаивайтесь! Осталось всего несколько правил…
Затем мы доходим до правил для LeftHandSideExpression:
LeftHandSideExpression :NewExpressionCallExpressionOptionalExpression
Не очевидно, какое правило может применяться к o2.foo. Нам просто нужно знать (или выяснить), что NewExpression не обязательно должен содержать ключевое слово new.
MemberExpression звучит как то, что мы искали, поэтому теперь мы берем правило
Итак, o2.foo является MemberExpression, если o2 является допустимым MemberExpression. К счастью, это намного проще увидеть:
MemberExpression : PrimaryExpression
o2 наверняка является Identifier, так что все в порядке. o2 является MemberExpression, значит o2.foo тоже является MemberExpression. MemberExpression является допустимым AssignmentExpression, следовательно, o2.foo также является AssignmentExpression.