Załóżmy, że piszę 0.5jak 0.-5w nieoczekiwany sposób, ale może nadal działać. Czego 0.się 0.-5zrobić tak, że można go uruchomić i nadal ma wartość -5?
Próbowałem też, alert(0.-5+1)który drukuje -4, czy JavaScript ignoruje 0.w 0.-5?
Załóżmy, że piszę 0.5jak 0.-5w nieoczekiwany sposób, ale może nadal działać. Czego 0.się 0.-5zrobić tak, że można go uruchomić i nadal ma wartość -5?
Próbowałem też, alert(0.-5+1)który drukuje -4, czy JavaScript ignoruje 0.w 0.-5?
0.-5to „nieoczekiwany sposób”?
0.-5być błędem składni i nie zezwalać na literały zmiennoprzecinkowe z końcową kropką, ale zmuszać ludzi do pisania .0na końcu.
.uniemożliwia napisanie czegoś w stylu 123.toString(16)( 123..toString(16)(123.).toString(16)
Odpowiedzi:
Cyfry końcowe po a .są opcjonalne:
console.log(0. === 0); // true
Więc
0.-5
ewaluuje do
0 - 5
co jest sprawiedliwe -5. Podobnie,
0.-5+1
jest
0 - 5 + 1
który jest
-5 + 1
lub -4.
0.-5może zostać pomyślnie przeanalizowany jako 0.[1] , -a 5. Poniżej znajduje się abstrakcyjne drzewo składni dla wyrażenia wygenerowanego przez eksploratora AST:

To (w nieoczekiwany sposób) jest poprawnym JavaScriptem i ma wartość -5.
[1] Zgodnie z gramatyką literałów numerycznych cyfry dziesiętne i części wykładników są opcjonalne:
NumericLiteral ::
DecimalLiteral
[...]DecimalLiteral ::
DecimalIntegerLiteral. DecimalDigits opt ExponentPart opt
W JS możesz wyrazić liczbę z opcjonalną kropką dziesiętną.
x = 5.; //5
x = 5. + 6. //11
Od komentarza Tvde1 można również zastosować dowolną metodę numeryczną.
5..toString()
Ta składnia pozwala nam uruchamiać funkcje Number bez nawiasów.
5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome
Zobacz to pytanie, aby dowiedzieć się, dlaczego.
5..toString().
1.0jest zmiennoprzecinkowe, ale 1.jest liczbą całkowitą.
floats mają metody i 5.jest float.
(1).toMethod()jest to legalne, zabrania (1.)prawidłowego analizowania. Najbardziej tradycyjne podejście do analizowania (zachłanne leksowanie tokenów, w tym literałów, a następnie analizowanie) powoduje zachowanie JavaScript.
Myślę, że prawdziwa odpowiedź nie dotyczy przecinka, ale znaku minus: czy nie będzie to interpretowane jako operator, jeśli jest poprzedzone czymś, co wygląda jak liczba?
console.log(0. - 5) // -5
console.log(0 - 5) // -5
console.log('0.' - 5) // -5
console.log('0' - 5) // -5
console.log(0.-5 === -5) // true
„0” lub „0” oznacza to samo w JavaScript, ponieważ typ jest unikalny dla liczb, nazywany liczbą. Operator minus znajduje się między liczbami, staraj się zawsze konwertować to, co przekazujesz, na liczbę. W Pythonie jest inaczej, po pierwsze to Float, a po drugie Integer, ponieważ ma kilka typów.
0.jest jak0.0. Albo po prostu0.