Contenido adicional para "Entendiendo la especificación ECMAScript, parte 2"
¿Por qué es o2.foo
una AssignmentExpression
?
o2.foo
no parece una AssignmentExpression
ya que no hay asignación. ¿Por qué es una AssignmentExpression
?
La especificación permite en realidad una AssignmentExpression
tanto como argumento como en el lado derecho de una asignación. Por ejemplo:
function simple(a) {
console.log('El argumento fue ' + a);
}
simple(x = 1);
// → Registra “El argumento fue 1”.
x;
// → 1
…y…
x = y = 5;
x; // 5
y; // 5
o2.foo
es una AssignmentExpression
que no asigna nada. Esto se deduce de las siguientes producciones gramaticales, cada una tomando el caso "más simple" hasta la última:
Una AssignmentExpression
no necesita tener una asignación, también puede ser simplemente una ConditionalExpression
:
(También hay otras producciones, aquí mostramos solo la relevante.)
Una ConditionalExpression
no necesita tener una condicional (a == b ? c : d
), también puede ser simplemente una ShortcircuitExpression
:
Y así sucesivamente:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
Casi llegamos…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
¡No te desesperes! Solo un par de producciones más…
Luego llegamos a las producciones de LeftHandSideExpression
:
LeftHandSideExpression :
NewExpression
CallExpression
OptionalExpression
No está claro qué producción podría aplicarse a o2.foo
. Solo necesitamos saber (o averiguar) que una NewExpression
no tiene que tener necesariamente la palabra clave new
.
MemberExpression
suena a algo que estábamos buscando, así que ahora tomamos la producción
Por lo tanto, o2.foo
es una MemberExpression
si o2
es una MemberExpression
válida. Por suerte es mucho más fácil de ver:
MemberExpression : PrimaryExpression
o2
es seguramente un Identifier
, así que estamos bien. o2
es una MemberExpression
, por lo que o2.foo
también es una MemberExpression
. Una MemberExpression
es una AssignmentExpression
válida, por lo que o2.foo
también es una AssignmentExpression
.