Estoy leyendo esto, pero estoy confundido por lo que está escrito en el análisis con un capítulo de argumento radix
¿Por qué es que parseInt(8, 3)
→ NaN
y parseInt(16, 3)
→ 1
?
AFAIK 8 y 16 no son números de base 3, por lo parseInt(16, 3)
que NaN
también deberían volver
javascript
numbers
parseint
radix
Devid Farinelli
fuente
fuente
Respuestas:
Esto es algo que la gente tropieza todo el tiempo, incluso cuando lo saben. :-) Estás viendo esto por la misma razón que
parseInt("1abc")
devuelve 1: separseInt
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, vuelveNaN
.parseInt(8, 3)
significa "analizar"8"
en base 3" (tenga en cuenta que convierte el número8
en una cadena; detalles en la especificación ). Sin embargo, en base 3, los números de un solo dígito son sólo0
,1
y2
. Es como pedirle que se analice"9"
en octal. Como no había caracteres válidos, tienesNaN
.parseInt(16, 3)
le pide que analice"16"
en la base 3. Como puede analizar el1
, lo hace, y luego se detiene en el6
porque no puede analizarlo. Entonces vuelve1
.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. AsíparseInt("10x")
es10
; Elx
es ignorado. Admite un argumento opcional de radix (base de números), también loparseInt("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
octal; 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)
- Me gustaparseInt
, pero tiene números de coma flotante y solo admite decimales. Una vez más caracteres adicionales en la cadena se tienen en cuenta, por lo queparseFloat("10.5x")
es10.5
(elx
se ignora). Como solo se admite el decimal,parseFloat("0x15")
es0
(porque el análisis termina enx
). DevuelveNaN
si no se encuentran dígitos analizables.Unario
+
, p+str
. Ej. - (p. Ej., 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 = hexadecimal;0o
prefijo = octal [ES2015 +]; algunas implementaciones lo extienden para tratar una guía0
como octal, pero no en modo estricto).+"10x"
esNaN
debido a que elx
se no ignorados.+"10"
es10
,+"10.5"
es10.5
,+"0x15"
es21
,+"0o10"
es8
[ES2015 +]. Tiene un problema:+""
es0
, noNaN
como se podría esperar.Number(str)
- Exactamente como la conversión implícita (por ejemplo, como el unario+
anterior), pero más lenta en algunas implementaciones. (No es probable que importe).fuente
parseInt
primeros usostoString
en el primer argumento? Eso tendría sentido.parseInt
algoritmo: ecma-international.org/ecma-262/7.0/…123e-2
da1
ya que se convierte1.23
primero, y luego el análisis se detiene en el punto decimalNumberFormatException
cada vez.parseInt
(coaccionar el primer argumento para encadenar) tiene sentido. El propósito deparseInt
es analizar una cadena a un número entero. Entonces, si le das algo que no es una cadena, tiene sentido comenzar con la representación de la cadena. Lo que hace después de que es un todo 'tro historia ...Por la misma razón que
En el documento ,
parseInt
toma una cadena. YEntonces
16
,8
o'1foobar'
se convierte primero en cadena.Luego
Lo que significa que se convierte hasta donde puede. El
6
,8
yfoobar
se ignoran, y sólo lo que antes se es convertido. Si no hay nada,NaN
se devuelve.fuente
Algunos ejemplos más:
fuente