2015-09-17 2 views
6

Der folgende Ausdruck scheint wie vorgesehen zu funktionieren und den aktuellen Zeitstempel zurückzugeben.Warum werden Operatoren im Ausdruck new Date(). GetTime() in der Reihenfolge von links nach rechts angewendet?

new Date().getTime() 

Allerdings kann ich nicht verstehen, warum Operatoren in strikter Links-Rechts-Reihenfolge hier angewendet werden.

MDN sagt der Mitglied (.) Operator hat höhere Priorität als new. Dies würde bedeuten, dass . vor new angewendet werden muss.

new (Date().getTime()) 

Aber in der Tat ist es bewertet als: So sollte der Ausdruck als ausgewertet werden

(new Date()).getTime() 

Ich denke, es muss etwas sein, ich übersehen habe, aber ich kann nicht verstehen, was passiert.

Hinweis: Ich verwende diesen Ausdruck nicht wirklich (ich bevorzuge Date.now() Methode). Es ist nur meine Neugier.

Antwort

7

Die MDN-Rangfolge-Tabelle ist nicht wirklich korrekt; Der new-Operator und die Eigenschaftenzugriffsoperatoren sind alle Teil der MemberExpression non-terminal in der Grammatik. Da sie Linksassoziativität Operatoren sind,

new something.something 

als

(new something).something 
ausgewertet

Here der relevante Teil der Spezifikation.

daher in Ihrer Probe Ausdruck

new Date().getTime() 

die ganze linke Seite der . alsMember analysiert. Welche Art von MemberExpression ist es? Es ist eine new MemberExpression Produktion, also ist das tiefer in den Parse Baum und das gibt uns das links-assoziative Verhalten.

bearbeiten — etwas anderes, das ich gerade gedacht habe. Nehmen wir an, wir haben ein Objekt:

var obj = { 
    findConstructor: function(name) { 
    return window[name]; 
    } 
}; 

Nun wollen wir diesen Ausdruck versuchen, die Zeit mit diesem Objekt zu erhalten:

new obj.findConstructor("Date")().getTime() 

Das wird ein Fehler geben. (Ich bin auf dünnem Eis hier :) Das ist, weil es das analysiert, wie

, die eindeutig nicht funktioniert. Stattdessen müssen Sie explizite Klammern hinzufügen:

(new obj.findConstructor("Date")()).getTime() 
+1

Die detailliertere Tabelle, die es verknüpft - https: //developer.mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Operatoren/Operator_Precedence # Tabelle - zeigt, dass die drei die gleiche Priorität haben. –

+0

In der Tat, es ist schön, denn das ist die Art, wie es funktioniert :) – Pointy

+0

Danke. Jetzt kann ich MDN nicht vertrauen). – hindmost

Verwandte Themen