Zusätzlicher Inhalt für "Understanding the ECMAScript spec, Teil 2"
Warum ist o2.foo ein AssignmentExpression?
o2.foo sieht nicht wie eine AssignmentExpression aus, da es keine Zuweisung gibt. Warum ist es trotzdem eine AssignmentExpression?
Die Spezifikation erlaubt tatsächlich eine AssignmentExpression sowohl als Argument als auch auf der rechten Seite einer Zuweisung. Zum Beispiel:
function simple(a) {
console.log('Das Argument war ' + a);
}
simple(x = 1);
// → Gibt „Das Argument war 1“ aus.
x;
// → 1
…und…
x = y = 5;
x; // 5
y; // 5
o2.foo ist eine AssignmentExpression, die nichts zuweist. Dies ergibt sich aus den folgenden Produktionsregeln der Grammatik, jede nimmt den "einfachsten" Fall bis zur letzten:
Eine AssignmentExpression muss keine Zuweisung enthalten, sie kann auch einfach eine ConditionalExpression sein:
(Es gibt auch andere Produktionsregeln, aber hier zeigen wir nur die relevante.)
Eine ConditionalExpression muss keine Bedingung (a == b ? c : d) enthalten, sie kann auch einfach eine ShortcircuitExpression sein:
Und so weiter:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
Fast geschafft…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
Nicht verzweifeln! Nur noch ein paar Produktionsregeln…
Dann stoßen wir auf die Produktionsregel für LeftHandSideExpression:
LeftHandSideExpression :NewExpressionCallExpressionOptionalExpression
Es ist nicht eindeutig, welche Produktionsregel auf o2.foo zutreffen könnte. Wir müssen lediglich wissen (oder herausfinden), dass eine NewExpression nicht unbedingt das Schlüsselwort new enthalten muss.
MemberExpression klingt nach etwas, das wir gesucht haben, daher nehmen wir nun die Produktionsregel
Also ist o2.foo eine MemberExpression, wenn o2 eine gültige MemberExpression ist. Glücklicherweise ist das viel einfacher zu erkennen:
MemberExpression : PrimaryExpression
o2 ist sicher ein Identifier, also sind wir gut. o2 ist eine MemberExpression, also ist o2.foo auch eine MemberExpression. Eine MemberExpression ist eine gültige AssignmentExpression, daher ist o2.foo auch eine AssignmentExpression.