Conteúdo adicional para "Compreendendo a especificação ECMAScript, parte 2"
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
:
(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
:
E assim por diante:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
Estamos quase lá…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
Não desista! Apenas mais algumas produções…
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
.
MemberExpression
parece algo que estávamos procurando, então agora tomamos a produção
Portanto, o2.foo
é uma MemberExpression
se o2
for uma MemberExpression
válida. Felizmente, é muito mais fácil ver:
MemberExpression : PrimaryExpression
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
.