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)→ NaNy parseInt(16, 3)→ 1?
AFAIK 8 y 16 no son números de base 3, por lo parseInt(16, 3)que NaNtambié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: separseIntdetiene 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úmero8en una cadena; detalles en la especificación ). Sin embargo, en base 3, los números de un solo dígito son sólo0,1y2. 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 el6porque 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; Elxes ignorado. Admite un argumento opcional de radix (base de números), también loparseInt("15", 16)es21(15en 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 con0octal; ese comportamiento nunca se especificó, y se rechazó específicamente en la especificación ES5). DevuelveNaNsi 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(elxse ignora). Como solo se admite el decimal,parseFloat("0x15")es0(porque el análisis termina enx). DevuelveNaNsi 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;0xprefijo = hexadecimal;0oprefijo = octal [ES2015 +]; algunas implementaciones lo extienden para tratar una guía0como octal, pero no en modo estricto).+"10x"esNaNdebido a que elxse no ignorados.+"10"es10,+"10.5"es10.5,+"0x15"es21,+"0o10"es8[ES2015 +]. Tiene un problema:+""es0, noNaNcomo 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
parseIntprimeros usostoStringen el primer argumento? Eso tendría sentido.parseIntalgoritmo: ecma-international.org/ecma-262/7.0/…123e-2da1ya que se convierte1.23primero, y luego el análisis se detiene en el punto decimalNumberFormatExceptioncada vez.parseInt(coaccionar el primer argumento para encadenar) tiene sentido. El propósito deparseIntes 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 ,
parseInttoma una cadena. YEntonces
16,8o'1foobar'se convierte primero en cadena.Luego
Lo que significa que se convierte hasta donde puede. El
6,8yfoobarse ignoran, y sólo lo que antes se es convertido. Si no hay nada,NaNse devuelve.fuente
Algunos ejemplos más:
fuente