Ho un fastidioso problema in JavaScript .
> parseInt(1 / 0, 19)
> 18
Perché la parseInt
funzione ritorna 18
?
Ho un fastidioso problema in JavaScript .
> parseInt(1 / 0, 19)
> 18
Perché la parseInt
funzione ritorna 18
?
Risposte:
Il risultato di 1/0
è Infinity
.
parseInt
considera il suo primo argomento come una stringa che significa innanzitutto che Infinity.toString()
viene chiamato, producendo la stringa "Infinity"
. Quindi funziona come se gli avessi chiesto di convertire "Infinity"
in base 19 in decimale.
Ecco le cifre nella base 19 insieme ai loro valori decimali:
Base 19 Base 10 (decimal)
---------------------------
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a 10
b 11
c 12
d 13
e 14
f 15
g 16
h 17
i 18
Quello che succede dopo è che parseInt
scansiona l'input "Infinity"
per trovare quale parte può essere analizzata e si interrompe dopo aver accettato il primo I
(perché n
non è una cifra valida nella base 19).
Pertanto si comporta come se si chiamasse parseInt("I", 19)
, che viene convertito in decimale 18 dalla tabella sopra.
parseInt('Infini',24)
.
n
c'è anche una cifra valida, quindi finisce per farlo parseInt("Infini", 24)
.
Ecco la sequenza degli eventi:
1/0
valuta Infinity
parseInt
legge Infinity
e nota felicemente che I
è 18 in base 19parseInt
ignora il resto della stringa, poiché non può essere convertita.Tieni presente che otterrai un risultato per qualsiasi base >= 19
, ma non per quelle inferiori. Per le basi >= 24
, otterrai un risultato più grande, poiché n
a quel punto diventa una cifra valida.
parseInt
accetterà è 36, poiché l'alfabeto inglese contiene 26 lettere e la convenzione prevede l'uso di cifre e quindi di lettere come l'insieme di cifre valide nella base indicata.
Infinity
a "Infinity"
...
Per aggiungere alle risposte sopra:
parseInt ha lo scopo di analizzare le stringhe in numeri (l'indizio è nel nome). Nella tua situazione, non vuoi eseguire alcuna analisi poiché 1/0 è già un numero, quindi è una strana scelta di funzione. Se hai un numero (che fai) e vuoi convertirlo in una base particolare, dovresti invece usare toString con una radice .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Aggiungere alle risposte sopra
parseInt(1/0,19)
è equivalente a parseInt("Infinity",19)
All'interno di base 19 numeri 0-9
e A-I
(or a-i)
sono numeri validi. Quindi, dall '"Infinito" prende I
dalla base 19 e si converte in base 10 che diventa 18 Quindi cerca di prendere il carattere successivo, cioè n
che non è presente nella base 19, quindi scarta i caratteri successivi (secondo il comportamento di javascript di convertire la stringa in numero )
Quindi, se scrivi parseInt("Infinity",19)
OR parseInt("I",19)
OR parseInt("i",19)
il risultato sarà lo stesso vale a dire 18
.
Ora, se scrivi parseInt("I0",19)
il risultato sarà 342
come I X 19 (the base)^1 + 0 X 19^0
= 18 X 19^1 + 0 X 19^0
= 18 X 19 + 0 X 1
=342
Allo stesso modo, parseInt("I11",19)
si tradurrà in6518
vale a dire
18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 361 + 1 X 19 + 1 X 1
= 6498 + 19 + 1
= 6518
if
potrebbe essere d'aiuto.