2013-07-11 5 views
25

MDN states, dass es zwei Operatoren in Javscript, die die höchste Priorität teilen:Warum funktioniert "new Date(). ToString()" mit der Priorität von JavaScript-Operatoren?

  • Der links assoziativer Operator: foo.bar
  • Die rechtsassoziativ neuen Betreiber: new Foo()

ich in der Regel ausdrücklich Trennen Sie die beiden: (new Date()).toString()
Aber ich sehe häufig beide kombiniert: new Date().toString()

Nach this answer, der Grund, die zweite Art und Weise funktioniert, ist, dass es die zweite Bedienungs Assoziativität, was zählt, wenn beiden Operatoren gleich Vorrang haben. In diesem Fall bleibt der Elementoperator assoziativ, dh new Date() wird zuerst ausgewertet.

Wenn dies jedoch der Fall ist, warum dann nicht funktioniert new Date.toString()? Schließlich ist new Datejust syntactic sugar für new Date(). Das obige Argument besagt, dass es funktionieren sollte, aber offensichtlich nicht.

Was fehlt mir?

+1

Da der syntaktische Zucker nicht auf Instantiierung UND Member-Zugriff erstreckt. Es hängt vom Compiler ab. Etwas ähnliches Szenario: VB.NET hat 'Dim x As New ...', aber ich glaube nicht, dass wir 'Dim x als neues Datum(). ToString()' tun können. Wir können tun Dim X As String = neues Date(). ToString() '. – ps2goat

+1

Der Operator '()' führt den Konstruktor aus, bevor der '.' auf seine Eigenschaften zugreift. – Broxzier

+0

@ ps2goat Sie haben Recht, aber basierend auf der Antwort unten ist dies aufgrund der angegebenen Grammatik eher als Compiler launisch. –

Antwort

19

Die syntax ist

MemberExpression : 
    PrimaryExpression 
    FunctionExpression 
    MemberExpression [ Expression ] 
    MemberExpression . IdentifierName 
    new MemberExpression Arguments 

new foo().bar nicht als new (foo().bar) analysiert werden kann, weil foo().bar kein Member ist. Darüber hinaus kann new foo() aus dem gleichen Grund nicht als new (foo()) geparst werden. Umgekehrt ist new foo.bar geparst als new (foo.bar), weil foo.bar eine gültige MemberExpression ist (eine Interpretation (new foo).bar ist unmöglich, weil die Grammatik gierig ist).

Das heißt, die Vorrangregel ist: dot Beats neu, neue Beats nennen (parens).

. -> new ->() 

Weiterhin an der Grammatik direkt sucht entmystifiziert den syntaktischen Zucker, new Foo in new Foo() verwandelt. Es ist einfach NewExpression ← neue NewExpression ← neue PrimaryExpression:

NewExpression : 
    MemberExpression 
    new NewExpression 
5

ich den Kerl bin, der sowohl die Frage und die Antwort von „Disambiguation of expressions with neighboring operators of different associativity and same precedence“ schrieb, und als ich schrieb, dass ich nicht JavaScript in meinem Kopf hatte.

Die Sprache, die ich erwäge war Haskell, die eine funktionale Programmiersprache ist. Operatoren in solchen Sprachen sind einfach Funktionen und viel leichter zu verstehen. Jedoch schrieb ich meine Antwort in einer Weise, die keine Programmiersprache angenommen hat.

Auf der anderen Seite ist JavaScript eine traditionelle Programmiersprache und Ausdrücke in JavaScript sind auf der Grundlage ausgeklügelter Parsing-Regeln, die sich stark von den von Haskell verwendeten Parser-Regeln unterscheiden, disambiguiert.

Insbesondere Regeln JavaScript Parsing scheinen gierig zu sein.Zum Beispiel nehmen Sie Ihr erstes Beispiel:

new Date().toString() 

Hier ist der Funktionsaufruf nach Date Schilden Date vom Operator. Daher new, gierig, kann immer noch nur auf Date statt Date().toString arbeiten. Wir haben also:

((new Date()).toString)() 

Im zweiten Beispiel haben wir:

new Date.toString() 

Hier gibt es keinen Funktionsaufruf nach Date es von dem Mitglied des Bedieners zu schützen. Daher funktioniert new, gierig zu sein, auf dem Ausdruck Date.toString. Daher haben wir:

(new (Date.toString))() 

@ thg435 die Antwort unterstützt diese Behauptung. Der Punkt ist, dass ich ein formales System diskutierte, das völlig anders ist als das, das von JavaScript-Parsern implementiert wird. Das formale System, das ich diskutierte, behandelt Operatoren und Operanden als erstklassige Werte.

Verwandte Themen