Перейти к основному содержимому

Дополнительный контент для "Понимание спецификации ECMAScript, часть 2"

· 2 мин. чтения
[Марья Хёлтта](https://twitter.com/marjakh), наблюдатель за спекулятивной спецификацией

Почему 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:

AssignmentExpression : ConditionalExpression

(Есть и другие правила, здесь мы показываем только релевантное.)

ConditionalExpression не обязательно должен содержать условие (a == b ? c : d), он также может быть просто ShortcircuitExpression:

ConditionalExpression : ShortCircuitExpression

И так далее:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Почти готово…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

Не отчаивайтесь! Осталось всего несколько правил…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

Затем мы доходим до правил для LeftHandSideExpression:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

Не очевидно, какое правило может применяться к o2.foo. Нам просто нужно знать (или выяснить), что NewExpression не обязательно должен содержать ключевое слово new.

NewExpression : MemberExpression

MemberExpression звучит как то, что мы искали, поэтому теперь мы берем правило

MemberExpression : MemberExpression . IdentifierName

Итак, o2.foo является MemberExpression, если o2 является допустимым MemberExpression. К счастью, это намного проще увидеть:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2 наверняка является Identifier, так что все в порядке. o2 является MemberExpression, значит o2.foo тоже является MemberExpression. MemberExpression является допустимым AssignmentExpression, следовательно, o2.foo также является AssignmentExpression.