javascript - number - parseint java
¿Por qué es parseInt(8,3)== NaN y parseInt(16,3)== 1? (2)
Estoy leyendo this pero estoy confundido por lo que está escrito en el análisis con un capítulo de argumento radix
¿Por qué es
parseInt(8, 3)
→
NaN
y
parseInt(16, 3)
→
1
?
AFAIK 8 y 16 no son números de base 3, por lo que
parseInt(16, 3)
debería devolver
NaN
Esto es algo que la gente tropieza todo el tiempo, incluso cuando lo saben.
:-) Estás viendo esto por la misma razón por la que
parseInt("1abc")
devuelve 1:
parseInt
detiene en el primer carácter no válido y devuelve lo que tenga en ese punto.
Si no hay caracteres válidos para analizar, devuelve
NaN
.
parseInt(8, 3)
significa "analizar
"8"
en la base 3" (tenga en cuenta que convierte el número
8
en una cadena;
detalles en la especificación
).
Pero en la base 3, los números de un solo dígito son solo
0
,
1
y
2
.
Es como pedirle que analice
"9"
en octal.
Como no
había
caracteres válidos, obtuviste
NaN
.
parseInt(16, 3)
le pide que analice
"16"
en la base 3. Como puede analizar el
1
, lo hace, y luego se detiene en el
6
porque no puede analizarlo.
Entonces devuelve
1
.
Dado que esta pregunta está recibiendo mucha atención y podría tener un alto puntaje en los resultados de búsqueda, aquí hay un resumen de opciones para convertir cadenas en números en JavaScript, con sus diversas idiosincrasias y aplicaciones (extraídas de otra respuesta mía aquí en SO):
-
parseInt(str[, radix])
- Convierte la mayor cantidad posible del comienzo de la cadena en un número entero (entero), ignorando los caracteres adicionales al final. EntoncesparseInt("10x")
es10
; lax
se ignora. Admite un argumento opcional de radix (base de números), por lo queparseInt("15", 16)
es21
(15
en hexadecimal). Si no hay radix, asume decimal a menos que la cadena comience con0x
(o0X
), en cuyo caso se omite y asume hexadecimal. (Algunos navegadores solían tratar cadenas que comienzan con0
como octales; ese comportamiento nunca se especificó, y se rechazó específicamente en la especificación ES5). DevuelveNaN
si no se encuentran dígitos analizables. -
parseFloat(str)
: al igual queparseInt
, pero hace números de punto flotante y solo admite decimal. Nuevamente se ignoran los caracteres adicionales en la cadena, por lo queparseFloat("10.5x")
es10.5
(se ignora lax
). Como solo se admite el decimal,parseFloat("0x15")
es0
(porque el análisis termina en lax
). DevuelveNaN
si no se encuentran dígitos analizables. -
Unario
+
, por ejemplo,+str
- (por ejemplo, conversión implícita) Convierte la cadena completa en un número utilizando coma flotante y la notación de números estándar de JavaScript (solo dígitos y un punto decimal = decimal;0x
prefijo = hex;0o
prefijo = octal [ES2015 +] ; algunas implementaciones lo extienden para tratar un0
inicial como octal, pero no en modo estricto).+"10x"
esNaN
porque no se ignora lax
.+"10"
es10
,+"10.5"
es10.5
,+"0x15"
es21
,+"0o10"
es8
[ES2015 +]. Tiene un problema:+""
es0
, noNaN
como es de esperar. -
Number(str)
: exactamente igual que la conversión implícita (por ejemplo, como el unario+
anterior), pero más lenta en algunas implementaciones. (No es probable que importe).
Por la misma razón que
>> parseInt(''1foobar'',3)
<- 1
En
el documento
,
parseInt
toma una cadena.
Y
Si string no es una cadena, entonces se convierte en una cadena
Entonces
16
,
8
o
''1foobar''
se convierte primero en cadena.
Entonces
Si
parseInt
encuentra un carácter que no es un número en la raíz especificada, lo ignora y todos los caracteres siguientes
Lo que significa que se convierte hasta donde puede.
Los
6
,
8
y
foobar
se ignoran, y solo se convierte lo anterior.
Si no hay nada, se devuelve
NaN
.