Contenu supplémentaire pour "Comprendre la spécification ECMAScript, partie 2"
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 :
(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 :
Et ainsi de suite :
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
Presque arrivé…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
Ne désespérez pas ! Encore quelques productions…
Ensuite, nous arrivons aux productions pour LeftHandSideExpression :
LeftHandSideExpression :NewExpressionCallExpressionOptionalExpression
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.
MemberExpression semble être quelque chose que nous recherchions, alors maintenant nous prenons la production
Donc, o2.foo est une MemberExpression si o2 est une MemberExpression valide. Heureusement, cela est beaucoup plus simple à voir :
MemberExpression : PrimaryExpression
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.