Zum Hauptinhalt springen

Zusätzlicher Inhalt für "Understanding the ECMAScript spec, Teil 2"

· 3 Minuten Lesezeit
[Marja Hölttä](https://twitter.com/marjakh), spekulative Spezifikationsbeobachterin

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:

AssignmentExpression : ConditionalExpression

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

ConditionalExpression : ShortCircuitExpression

Und so weiter:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

Fast geschafft…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

Nicht verzweifeln! Nur noch ein paar Produktionsregeln…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

Dann stoßen wir auf die Produktionsregel für LeftHandSideExpression:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

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.

NewExpression : MemberExpression

MemberExpression klingt nach etwas, das wir gesucht haben, daher nehmen wir nun die Produktionsregel

MemberExpression : MemberExpression . IdentifierName

Also ist o2.foo eine MemberExpression, wenn o2 eine gültige MemberExpression ist. Glücklicherweise ist das viel einfacher zu erkennen:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

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.