javascript - valores - ¿Por qué parseInt(1/0, 19) devuelve 18?
parseint javascript (4)
Tengo un problema molesto en JavaScript.
> parseInt(1 / 0, 19)
> 18
¿Por qué parseInt
devuelve 18
?
Aquí está la secuencia de eventos:
-
1/0
evalúa alInfinity
-
parseInt
leeInfinity
y nota felizmente queI
18 en la base 19 -
parseInt
ignora el resto de la cadena, ya que no se puede convertir.
Tenga en cuenta que obtendría un resultado para cualquier base >= 19
, pero no para las bases debajo de eso. Para bases >= 24
, obtendrá un resultado mayor, ya que n
convierte en un dígito válido en ese punto.
El resultado de 1/0
es Infinity
.
parseInt
trata su primer argumento como una cadena que significa que primero se llama a Infinity.toString()
, produciendo la cadena "Infinity"
. Entonces funciona igual que si le pidieras que convirtiera "Infinity"
en base 19 a decimal.
Aquí están los dígitos en base 19 junto con sus valores decimales:
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
Lo que sucede a continuación es que parseInt
escanea la entrada "Infinity"
para encontrar qué parte se puede analizar y se detiene después de aceptar la primera I
(porque n
no es un dígito válido en la base 19).
Por lo tanto, se comporta como si llamara parseInt("I", 19)
, que se convierte al decimal 18 en la tabla de arriba.
Para añadir a las respuestas anteriores.
parseInt(1/0,19)
es equivalente a parseInt("Infinity",19)
Dentro de la base, los números 0-9
y AI
(or ai)
son números válidos. Entonces, desde el "Infinito" toma I
de base 19 y se convierte en base 10 que se convierte en 18 Luego intenta tomar el siguiente carácter, es decir, n
que no está presente en la base 19, así que descarta los siguientes caracteres (según el comportamiento de javascript de la cadena de conversión Al numero)
Por lo tanto, si escribe parseInt("Infinity",19)
O parseInt("I",19)
O parseInt("i",19)
el resultado será el mismo, es decir, 18
.
Ahora, si escribe parseInt("I0",19)
el resultado será 342
como IX 19 (the base)^1 + 0 X 19^0
= 18 X 19^1 + 0 X 19^0
= 18 X 19 + 0 X 1
= 342
De manera similar, parseInt("I11",19)
resultará en 6518
es decir
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
Para agregar a las respuestas anteriores:
parseInt está destinado a analizar cadenas en números (la pista está en el nombre). En su situación, no desea realizar ningún análisis ya que 1/0 ya es un número, por lo que es una opción de función extraña. Si tienes un número (lo que tienes) y quieres convertirlo en una base en particular, deberías usar toString con un radix .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"