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