Eu tenho um problema irritante em JavaScript .
> parseInt(1 / 0, 19)
> 18
Por que a parseInt
função retorna 18
?
Eu tenho um problema irritante em JavaScript .
> parseInt(1 / 0, 19)
> 18
Por que a parseInt
função retorna 18
?
Respostas:
O resultado de 1/0
é Infinity
.
parseInt
trata seu primeiro argumento como uma string, o que significa que antes de tudo Infinity.toString()
é chamado, produzindo a string "Infinity"
. Por isso, funciona da mesma forma como se você pedisse para converter"Infinity"
na base 19 em 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 para após aceitar a primeira I
(porque n
não é um dígito válido na base 19).
Portanto, ele se comporta como se você tivesse chamado parseInt("I", 19)
, o que é convertido em decimal 18 pela tabela acima.
parseInt('Infini',24)
.
n
também é um dígito válido, ele acaba fazendo parseInt("Infini", 24)
.
Aqui está a sequência de eventos:
1/0
avalia como Infinity
parseInt
lê Infinity
e observa alegremente que I
tem 18 anos na base 19parseInt
ignora o restante da string, pois não pode ser convertido.Observe que você obteria um resultado para qualquer base >= 19
, mas não para as bases abaixo dela. Para bases >= 24
, você obterá um resultado maior, pois n
se torna um dígito válido nesse ponto.
parseInt
aceita é 36, já que existem 26 letras no alfabeto inglês, e a convenção é usar dígitos e depois letras como o conjunto de dígitos válidos na base fornecida.
Infinity
para "Infinity"
...
Para adicionar às respostas acima:
parseInt tem como objetivo analisar seqüências de caracteres em números (a pista está no nome). Na sua situação, você não deseja fazer nenhuma análise, já que 1/0 já é um número, portanto, é uma escolha estranha de função. Se você tem um número (o que você faz) e deseja convertê-lo em uma base específica, use toString com uma raiz .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Para adicionar às respostas acima
parseInt(1/0,19)
é equivalente a parseInt("Infinity",19)
Dentro dos números base 19 0-9
e A-I
(or a-i)
são números válidos. Então, a partir do "Infinito", leva I
da base 19 e converte na base 10, que passa a 18. Então, tenta pegar o próximo caractern
que não está presente na base 19, para descartar os próximos caracteres (conforme o comportamento do javascript de converter a string em número )
Então, se você escrever parseInt("Infinity",19)
OR parseInt("I",19)
OU, parseInt("i",19)
o resultado será o mesmo, ie 18
.
Agora, se você escrever parseInt("I0",19)
o resultado será 342
como 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
Da mesma forma, parseInt("I11",19)
resultará em6518
ie
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
pode ajudar.