Saltar al contenido principal

Contenido adicional para "Entendiendo la especificación ECMAScript, parte 2"

· 3 min de lectura
[Marja Hölttä](https://twitter.com/marjakh), espectador especulativo de especificaciones

¿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:

AssignmentExpression : 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:

ConditionalExpression : ShortCircuitExpression

Y así sucesivamente:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Casi llegamos…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

¡No te desesperes! Solo un par de producciones más…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

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.

NewExpression : MemberExpression

MemberExpression suena a algo que estábamos buscando, así que ahora tomamos la producción

MemberExpression : MemberExpression . IdentifierName

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

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

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.