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