Tengo un problema molesto en JavaScript .
> parseInt(1 / 0, 19)
> 18
¿Por qué vuelve la parseInt
función 18
?
javascript
parseint
cebor
fuente
fuente
if
podría ayudar.Respuestas:
El resultado de
1/0
esInfinity
.parseInt
trata su primer argumento como una cadena, lo que significa que primeroInfinity.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:
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 primeraI
(porquen
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.fuente
parseInt('Infini',24)
.n
también es un dígito válido, por lo que en realidad termina haciendoparseInt("Infini", 24)
.Aquí está la secuencia de eventos:
1/0
evalúa aInfinity
parseInt
leeInfinity
y felizmente señala queI
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 sen
convierte en un dígito válido en ese punto.fuente
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 .
fuente
Para agregar a las respuestas anteriores
parseInt(1/0,19)
es equivalente aparseInt("Infinity",19)
Dentro de la base 19 números
0-9
yA-I
(or a-i)
son números válidos. Entonces, desde el "Infinito" tomaI
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)
ORparseInt("I",19)
OparseInt("i",19)
el resultado será el mismo, es decir18
.Ahora, si escribes
parseInt("I0",19)
el 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
Del mismo modo,
parseInt("I11",19)
dará lugar a6518
es decir
fuente