Pular para o conteúdo principal

Conteúdo adicional para "Compreendendo a especificação ECMAScript, parte 2"

· Leitura de 3 minutos
[Marja Hölttä](https://twitter.com/marjakh), espectadora especulativa de especificações

Por que o2.foo é uma AssignmentExpression?

o2.foo não parece ser uma AssignmentExpression, já que não há atribuição. Por que ela é uma AssignmentExpression?

Na verdade, a especificação permite uma AssignmentExpression tanto como um argumento quanto como o lado direito de uma atribuição. Por exemplo:

function simple(a) {
console.log('O argumento foi ' + a);
}
simple(x = 1);
// → Registra “O argumento foi 1”.
x;
// → 1

…e…

x = y = 5;
x; // 5
y; // 5

o2.foo é uma AssignmentExpression que não atribui nada. Isso decorre das seguintes produções gramaticais, cada uma tomando o caso "mais simples" até a última:

Uma AssignmentExpression não precisa ter uma atribuição, ela pode ser apenas uma ConditionalExpression:

AssignmentExpression : ConditionalExpression

(Existem outras produções também, aqui mostramos apenas a relevante.)

Uma ConditionalExpression não precisa ter uma condicional (a == b ? c : d), ela pode ser apenas uma ShortcircuitExpression:

ConditionalExpression : ShortCircuitExpression

E assim por diante:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Estamos quase lá…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

Não desista! Apenas mais algumas produções…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

Então chegamos às produções para LeftHandSideExpression:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

Não está claro qual produção pode se aplicar a o2.foo. Só precisamos saber (ou descobrir) que uma NewExpression não precisa necessariamente ter a palavra-chave new.

NewExpression : MemberExpression

MemberExpression parece algo que estávamos procurando, então agora tomamos a produção

MemberExpression : MemberExpression . IdentifierName

Portanto, o2.foo é uma MemberExpression se o2 for uma MemberExpression válida. Felizmente, é muito mais fácil ver:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2 certamente é um Identifier, então estamos bem. o2 é uma MemberExpression, então o2.foo também é uma MemberExpression. Uma MemberExpression é uma AssignmentExpression válida, então o2.foo também é uma AssignmentExpression.