Eu tenho um problema irritante em JavaScript .
> parseInt(1 / 0, 19)
> 18
Por que a parseInt
função retorna 18
?
javascript
parseint
cebor
fonte
fonte
if
pode ajudar.Respostas:
O resultado de
1/0
éInfinity
.parseInt
trata seu primeiro argumento como uma string, o que significa que antes de tudoInfinity.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:
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 primeiraI
(porquen
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.fonte
parseInt('Infini',24)
.n
também é um dígito válido, ele acaba fazendoparseInt("Infini", 24)
.Aqui está a sequência de eventos:
1/0
avalia comoInfinity
parseInt
lêInfinity
e observa alegremente queI
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, poisn
se torna um dígito válido nesse ponto.fonte
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 .
fonte
Para adicionar às respostas acima
parseInt(1/0,19)
é equivalente aparseInt("Infinity",19)
Dentro dos números base 19
0-9
eA-I
(or a-i)
são números válidos. Então, a partir do "Infinito", levaI
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)
ORparseInt("I",19)
OU,parseInt("i",19)
o resultado será o mesmo, ie18
.Agora, se você escrever
parseInt("I0",19)
o resultado será342
comoI 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
fonte