Eu tenho um problema irritante em JavaScript .
> parseInt(1 / 0, 19)
> 18
Por que a parseIntfunção retorna 18?
Eu tenho um problema irritante em JavaScript .
> parseInt(1 / 0, 19)
> 18
Por que a parseIntfunção retorna 18?
Respostas:
O resultado de 1/0é Infinity.
parseInttrata 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 parseIntvarre a entrada "Infinity"para descobrir qual parte dela pode ser analisada e para após aceitar a primeira I(porque nnã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).
ntambém é um dígito válido, ele acaba fazendo parseInt("Infini", 24).
Aqui está a sequência de eventos:
1/0 avalia como InfinityparseIntlê Infinitye observa alegremente que Item 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 nse torna um dígito válido nesse ponto.
parseIntaceita é 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.
Infinitypara "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-9e A-I (or a-i)são números válidos. Então, a partir do "Infinito", leva Ida 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
ifpode ajudar.