Jak parser wie, że część po znaku .
ma oznaczać wywołanie metody zamiast kolejną część numeru? Na przykład:
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?
Z tego powodu nie można wywoływać metod na literałach numerycznych. Umieszczając literał w nawiasie (the grouping operator), środowisko wykonawcze oceni zawarte wyrażenie i zastosuje metodę do wyniku tej oceny.
Operator grupujący usuwa niejednoznaczność znaku .
.
Aktualizacja
Po namyśle i niektóre dochodzenia przez spec, to jest dobry powód, aby nie zezwolić na stosowanie uprzedzona do ustalenia, czy co następuje znak .
jest częścią numeru lub identyfikator nieruchomości.
Jako @ CygnusX1 wspomniano w komentarzach, trzeba jednak, że te dwie sytuacje (.
obserwowani przez cyfry i .
następnie charakterze non-numerycznej) może być zróżnicowana w zależności od zastosowania uprzedzona. Ponieważ identyfikatory nie mogą zaczynać się od liczby, jeśli znak numeryczny podąża za .
, musi to być liczba. Jeśli znak nieliczbowy podąża za .
, nie może być częścią tej liczby. Ale to nie w porządku.
Jest jedna sytuacja, w której postać nienumeryczny może obserwować charakter .
ale nadal być częścią numeru:
console.log(1.e5); // Logs '100000'
e
wskazuje, że co za tym idzie jest wykładnik, a może być małymi lub wielkimi literami. Z tego powodu użycie wyprzedzenia musiałoby uwzględniać fakt, że jeśli znak następujący po .
jest nadal zgodny, może nadal reprezentować metodę lub część tej liczby. Łatwiej jest po prostu zabronić używania właściwości literałów numerycznych.
Czy sprawdzasz 'Number.isNaN'? Masz na myśli 'this.isNaN()'? – David
Oprócz poniższych odpowiedzi, sprawdź: '987654321..toMillion()' – Izkata
@David - To byłoby po prostu 'isNaN (this)' (jest to funkcja globalna, a nie właściwość 'Numer.prototype'). –