Supponiamo che io scriva 0.5
come 0.-5
in un modo inaspettato, ma può ancora funzionare. Cosa fa 0.
in 0.-5
modo che possa ancora funzionare e restituisca -5?
Ho anche provato alert(0.-5+1)
quali stampe -4, JavaScript ignora 0.
in 0.-5
?
Supponiamo che io scriva 0.5
come 0.-5
in un modo inaspettato, ma può ancora funzionare. Cosa fa 0.
in 0.-5
modo che possa ancora funzionare e restituisca -5?
Ho anche provato alert(0.-5+1)
quali stampe -4, JavaScript ignora 0.
in 0.-5
?
0.-5
sia un "modo inaspettato"?
0.-5
essere un errore di sintassi e non consentire i valori letterali float con un punto finale, ma costringere le persone a scrivere .0
alla fine.
.
ti impedisce di scrivere qualcosa del tipo 123.toString(16)
(Un trucco comune è usare 123..toString(16)
, che è davvero (123.).toString(16)
)
Risposte:
Le cifre finali dopo la a .
sono facoltative:
console.log(0. === 0); // true
Così
0.-5
valuta a
0 - 5
che è giusto -5
. Allo stesso modo,
0.-5+1
è
0 - 5 + 1
che è
-5 + 1
o -4
.
0.-5
potrebbe essere analizzato con successo come 0.
[1] , -
e 5
. Di seguito è riportato l'albero della sintassi astratta per l'espressione generata da AST explorer:
Questo (in modo inaspettato) è JavaScript valido e restituisce -5
.
[1] Secondo la grammatica per i letterali numerici, le cifre decimali e le parti esponenti sono opzionali:
NumericLiteral ::
DecimalLiteral
[...]DecimalLiteral ::
DecimalIntegerLiteral. DecimalDigits opt ExponentPart opt
In JS puoi esprimere un numero con il punto decimale opzionale.
x = 5.; //5
x = 5. + 6. //11
E a partire dal commento di Tvde1, è possibile applicare anche qualsiasi metodo Number.
5..toString()
Questa sintassi ci consente di eseguire le funzioni numeriche senza parentesi.
5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome
Vedi questa domanda per scoprire perché.
5..toString()
.
1.0
è in virgola mobile ma 1.
è un numero intero.
float
ha metodi ed 5.
è un file float
.
(1).toMethod()
è legale vieta (1.)
dal parsing correttamente. L'approccio più tradizionale all'analisi (lexing avido dei token, inclusi i letterali, quindi l'analisi) produce il comportamento Javascript.
Penso che la vera risposta non sia sul punto decimale, ma sul segno meno: non sarà interpretato come un operatore se è preceduto da qualcosa che assomiglia a un numero?
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." o "0" è lo stesso in JavaScript perché il tipo è univoco per i numeri, chiamato Numero. L'operatore meno è tra i numeri, cerca sempre di convertire ciò che passi in un numero. In Python è diverso il primo è un Float e il secondo un Integer perché ha diversi tipi.
0.
è come0.0
. O semplicemente0
.