Tengo un problema molesto en JavaScript .
> parseInt(1 / 0, 19)
> 18
¿Por qué vuelve la parseInt
función 18
?
Tengo un problema molesto en JavaScript .
> parseInt(1 / 0, 19)
> 18
¿Por qué vuelve la parseInt
función 18
?
Respuestas:
El resultado de 1/0
es Infinity
.
parseInt
trata su primer argumento como una cadena, lo que significa que primero Infinity.toString()
se llama, produciendo la cadena "Infinity"
. Por lo tanto, funciona igual que si le pidiera que se 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 después es que parseInt
escanea la entrada "Infinity"
para encontrar qué parte de ella 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 hubiera llamado parseInt("I", 19)
, que se convierte al 18 decimal según la tabla anterior.
parseInt('Infini',24)
.
n
también es un dígito válido, por lo que en realidad termina haciendo parseInt("Infini", 24)
.
Aquí está la secuencia de eventos:
1/0
evalúa a Infinity
parseInt
lee Infinity
y felizmente señala que I
es 18 en base 19parseInt
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 por debajo de eso. Para las bases >= 24
, obtendrás un resultado mayor, ya que se n
convierte en un dígito válido en ese punto.
parseInt
se aceptará es 36, ya que hay 26 letras en el alfabeto inglés, y la convención es usar dígitos y luego letras como el conjunto de dígitos válidos en la base dada.
Infinity
a "Infinity"
...
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 elección extraña de función. Si tiene un número (lo que tiene) y desea convertirlo a una base en particular, debe usar toString con una raíz .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Para agregar a las respuestas anteriores
parseInt(1/0,19)
es equivalente a parseInt("Infinity",19)
Dentro de la base 19 números 0-9
y A-I
(or a-i)
son números válidos. Entonces, desde el "Infinito" toma I
de la base 19 y se convierte en la base 10 que se convierte en 18 Luego, trata de tomar el siguiente carácter, es decir, n
que no está presente en la base 19, por lo que descarta los siguientes caracteres (según el comportamiento de JavaScript de convertir una cadena a un número )
Entonces, si escribe parseInt("Infinity",19)
OR parseInt("I",19)
O parseInt("i",19)
el resultado será el mismo, es decir 18
.
Ahora, si escribes parseInt("I0",19)
el 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
Del mismo modo, parseInt("I11",19)
dará lugar a6518
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
if
podría ayudar.