Ignacio Vazquez-Abrams es correcto, pero veamos exactamente cómo funciona ...
De 15.1.2.2 parseInt (string , radix)
:
Cuando se llama a la función parseInt, se toman los siguientes pasos:
- Deje que inputString sea ToString (cadena).
- Sea S una nueva subcadena de inputString que consta del primer carácter que no es un StrWhiteSpaceChar y todos los caracteres que siguen a ese carácter. (En otras palabras, elimine los espacios en blanco iniciales).
- Let sign be 1.
- Si S no está vacío y el primer carácter de S es un signo menos, deje que el signo sea −1.
- Si S no está vacío y el primer carácter de S es un signo más + o un signo menos -, elimine el primer carácter de S.
- Deje R = ToInt32 (radix).
- Deje que stripPrefix sea verdadero.
- Si R ≠ 0, entonces a. Si R <2 o R> 36, entonces devuelve NaN. si. Si R ≠ 16, deje que stripPrefix sea falso.
- De lo contrario, R = 0 a. Deje R = 10.
- Si stripPrefix es verdadero, entonces a. Si la longitud de S es al menos 2 y los dos primeros caracteres de S son "0x" o "0X", elimine los dos primeros caracteres de S y deje R = 16.
- Si S contiene algún carácter que no sea un dígito radix-R, entonces Z sea la subcadena de S que consta de todos los caracteres antes del primer carácter; de lo contrario, que Z sea S.
- Si Z está vacío, devuelve NaN.
- Sea matemático el valor entero matemático que está representado por Z en notación radix-R, usando las letras AZ y az para dígitos con valores del 10 al 35. (Sin embargo, si R es 10 y Z contiene más de 20 dígitos significativos, cada significativo el dígito después del 20 puede ser reemplazado por un dígito 0, a opción de la implementación; y si R no es 2, 4, 8, 10, 16 o 32, entonces matemática puede ser una aproximación dependiente de la implementación al entero matemático valor representado por Z en notación radix-R.)
- Sea número el valor de Número para mathInt.
- Signo de retorno × número.
NOTA parseInt puede interpretar solo una parte inicial de la cadena como un valor entero; ignora los caracteres que no se pueden interpretar como parte de la notación de un número entero, y no se da ninguna indicación de que dichos caracteres hayan sido ignorados.
Hay dos partes importantes aquí. Los en negrita los dos. Entonces, antes que nada, tenemos que descubrir cuál es la toString
representación de null
. Necesitamos mirar Table 13 — ToString Conversions
en la sección 9.8.0 para esa información:
Genial, así que ahora sabemos que hacer toString(null)
internamente produce una 'null'
cadena. Genial, pero ¿cómo maneja exactamente los dígitos (caracteres) que no son válidos dentro de la raíz proporcionada?
Miramos arriba 15.1.2.2
y vemos la siguiente observación:
Si S contiene algún carácter que no sea un dígito radix-R, entonces Z sea la subcadena de S que consta de todos los caracteres antes del primer carácter; de lo contrario, que Z sea S.
Eso significa que manejamos todos los dígitos ANTES de la raíz especificada e ignoramos todo lo demás.
Básicamente, hacer parseInt(null, 23)
es lo mismo que parseInt('null', 23)
. Esto u
hace que los dos l
se ignoren (a pesar de que SON parte de la raíz 23). Por lo tanto, solo podemos analizar n
, haciendo que toda la declaración sea sinónimo de parseInt('n', 23)
. :)
De cualquier manera, ¡gran pregunta!