Wie würde der Parser wissen, dass der Teil nach dem .
Charakter einen Methodenaufruf, um anzuzeigen, anstatt einen anderen Teil der Anzahl gemeint? Zum Beispiel:
10.1 // This is a number with a floating point
10.toMillion() //How does it know that this shouldn't be part of the number?
Aus diesem Grunde können Sie diese Methoden nicht auf Zahlenliterale nennen. Wenn Sie das Literal in Klammern setzen (grouping operator), bewertet die Laufzeitumgebung den enthaltenen Ausdruck und wendet die Methode auf das Ergebnis dieser Auswertung an.
Der Gruppierungsoperator entfernt die Mehrdeutigkeit des .
-Zeichens.
aktualisiert
Nach einigem Nachdenken und einige Untersuchungen durch die Spezifikation gibt es einen guten Grund, nicht der Verwendung eines Look-Ahead erlauben zu bestimmen, ob, was folgt den .
Charakter ist Teil der Nummer oder eine Eigenschaftskennung.
Wie @ CygnusX1 in den Kommentaren erwähnt, hätten Sie jedoch, dass die beiden Situationen (.
gefolgt von einer Ziffer und .
gefolgt von einem nicht numerischen Zeichen) durch die Verwendung eines Lookahead unterschieden werden könnte. Da Bezeichner nicht mit einer Nummer 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 ist eine Situation, in der ein nicht-numerischen Zeichen der .
Zeichen folgen können, aber immer noch Teil der Zahl sein:
console.log(1.e5); // Logs '100000'
Die e
zeigt an, dass, was folgt, ist der Exponenten, und es kann sei entweder Klein- oder Großbuchstaben. Aus diesem Grund muss bei der Verwendung eines Lookahead berücksichtigt werden, dass das Zeichen, das dem .
e
oder E
folgt, 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.
Warum überprüfen Sie 'Number.isNaN'? Meinst du "this.isNaN()"? – David
Zusätzlich zu den folgenden Antworten, check out: '987654321..toMillion()' – Izkata
@David - Es wäre nur 'isNaN (this)' (es ist eine globale Funktion, keine Eigenschaft von 'Number.prototype'). –