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 :NewExpressionCallExpressionOptionalExpression
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.