javascript - try - parseint es6
Por que parseInt(1/0, 19) retorna 18? (3)
Eu tenho um problema chato em JavaScript.
> parseInt(1 / 0, 19)
> 18
Por que o parseInt
retorna 18
?
Aqui está a sequência de eventos:
-
1/0
avalia paraInfinity
-
parseInt
lêInfinity
e felizmente observa queI
18 anos na base 19 -
parseInt
ignora o restante da string, já que ela não pode ser convertida.
Note que você obteria um resultado para qualquer base >= 19
, mas não para bases abaixo disso. Para bases >= 24
, você obterá um resultado maior, pois n
se torna um dígito válido naquele ponto.
O resultado de 1/0
é Infinity
.
parseInt
trata seu primeiro argumento como uma string que significa que primeiro Infinity.toString()
é chamado, produzindo a string "Infinity"
. Então funciona da mesma forma como se você pedisse para converter "Infinity"
na base 19 para decimal.
Aqui estão os dígitos na base 19, juntamente com seus valores decimais:
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
O que acontece a seguir é que parseInt
varre a entrada "Infinity"
para descobrir qual parte dela pode ser analisada e pára depois de aceitar a primeira I
(porque n
não é um dígito válido na base 19).
Portanto, ele se comporta como se você chamasse parseInt("I", 19)
, que se converte em decimal 18 pela tabela acima.
Para adicionar as respostas acima:
parseInt destina-se a analisar cadeias de caracteres em números (a pista está no nome). Na sua situação, você não quer fazer nenhuma análise, pois 1/0 já é um número, então é uma estranha escolha de função. Se você tem um número (o que você faz) e deseja convertê-lo para uma base específica, você deve usar toString com um radical em vez disso.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"