Załóżmy, że piszę 0.5
jak 0.-5
w nieoczekiwany sposób, ale może nadal działać. Czego 0.
się 0.-5
zrobić 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.5
jak 0.-5
w nieoczekiwany sposób, ale może nadal działać. Czego 0.
się 0.-5
zrobić 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.-5
to „nieoczekiwany sposób”?
0.-5
być błędem składni i nie zezwalać na literały zmiennoprzecinkowe z końcową kropką, ale zmuszać ludzi do pisania .0
na 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.-5
moż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.0
jest zmiennoprzecinkowe, ale 1.
jest liczbą całkowitą.
float
s 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
.