Ich habe eine einfache Erweiterungsmethode geschrieben.
%Vor% 987654321.toMillion()
löst aus:
SyntaxError: Unerwartetes Token ILLEGAL
Aber (987654321).toMillion()
funktioniert.
Meine Frage ist also: Was ist der Unterschied zwischen 987
und (987)
?
Nur zur Info:
%Vor%Und
%Vor% Wie würde der Parser wissen, dass der Teil, der dem Zeichen .
folgt, einen Methodenaufruf anstelle eines anderen Teils der Zahl bedeuten soll? Zum Beispiel:
Aus diesem Grund können Sie keine Methoden für numerische Literale aufrufen. Wenn Sie das Literal in Klammern setzen (den Gruppierungsoperator ), evaluiert die Laufzeitumgebung den enthaltenen Ausdruck und wendet die Methode auf Ergebnis dieser Bewertung.
Der Gruppierungsoperator entfernt die Mehrdeutigkeit des .
-Zeichens.
Aktualisieren
Nach einigen Gedanken und Untersuchungen durch die Spezifikation gibt es einen guten Grund, die Verwendung eines Lookaheads nicht zuzulassen, um zu bestimmen, ob das, was dem .
-Zeichen folgt, Teil der Zahl oder einer Eigenschaftskennung ist.
Wie @ CygnusX1 in den Kommentaren erwähnt, hätten Sie jedoch die beiden Situationen ( .
gefolgt von einer Ziffer und .
gefolgt von einem nicht-numerischen Zeichen) durch die Verwendung eines Lookaheads unterscheiden können. Da Bezeichner nicht mit einer Zahl beginnen können, muss ein numerisches Zeichen nach dem .
eine Zahl sein. Wenn dem .
ein nicht numerisches Zeichen folgt, kann es nicht Teil der Nummer sein. Aber das ist nicht ganz richtig.
Es gibt eine Situation, in der ein nicht numerisches Zeichen dem .
-Zeichen folgen kann, aber immer noch Teil der Zahl sein muss:
Das e
gibt an, dass der Exponent folgt und in Klein- oder Großbuchstaben geschrieben werden kann. Aus diesem Grund muss bei der Verwendung eines Lookahead berücksichtigt werden, dass, wenn das Zeichen nach .
e
oder E
ist, es immer noch eine Methode oder einen Teil der Zahl darstellen kann. Es ist einfacher, die Verwendung von Eigenschaften für numerische Literale einfach zu verbieten.
Tags und Links javascript prototype