Aller au contenu principal

Contenu supplémentaire pour "Comprendre la spécification ECMAScript, partie 2"

· 3 minutes de lecture
[Marja Hölttä](https://twitter.com/marjakh), spectatrice de spécifications spéculatives

Pourquoi o2.foo est-il une AssignmentExpression ?

o2.foo ne ressemble pas à une AssignmentExpression puisqu'il n'y a pas d'affectation. Pourquoi est-ce une AssignmentExpression ?

La spécification autorise en fait une AssignmentExpression à la fois comme argument et comme côté droit d'une affectation. Par exemple :

function simple(a) {
console.log('L'argument était ' + a);
}
simple(x = 1);
// → Affiche “L'argument était 1”.
x;
// → 1

…et…

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

o2.foo est une AssignmentExpression qui n'assigne rien. Cela découle des productions grammaticales suivantes, chaque une prenant le cas « le plus simple » jusqu'à la dernière :

Une AssignmentExpression n'a pas besoin d'avoir une affectation, elle peut aussi être juste une ConditionalExpression :

AssignmentExpression : ConditionalExpression

(Il existe d'autres productions également, ici nous montrons uniquement celle pertinente.)

Une ConditionalExpression n'a pas besoin d'avoir une condition (a == b ? c : d), elle peut aussi être simplement une ShortcircuitExpression :

ConditionalExpression : ShortCircuitExpression

Et ainsi de suite :

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Presque arrivé…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

Ne désespérez pas ! Encore quelques productions…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

Ensuite, nous arrivons aux productions pour LeftHandSideExpression :

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

Il n'est pas évident de savoir quelle production pourrait s'appliquer à o2.foo. Nous devons simplement savoir (ou découvrir) qu'une NewExpression n'a pas nécessairement besoin du mot-clé new.

NewExpression : MemberExpression

MemberExpression semble être quelque chose que nous recherchions, alors maintenant nous prenons la production

MemberExpression : MemberExpression . IdentifierName

Donc, o2.foo est une MemberExpression si o2 est une MemberExpression valide. Heureusement, cela est beaucoup plus simple à voir :

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2 est sûrement un Identifier donc nous sommes bons. o2 est une MemberExpression, donc o2.foo est également une MemberExpression. Une MemberExpression est une AssignmentExpression valide, donc o2.foo est également une AssignmentExpression.