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 Date
just syntactic sugar für new Date()
. Das obige Argument besagt, dass es funktionieren sollte, aber offensichtlich nicht.
Was fehlt mir?
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
Der Operator '()' führt den Konstruktor aus, bevor der '.' auf seine Eigenschaften zugreift. – Broxzier
@ ps2goat Sie haben Recht, aber basierend auf der Antwort unten ist dies aufgrund der angegebenen Grammatik eher als Compiler launisch. –