Ignacio Vazquez-Abrams está correto, mas vamos ver exatamente como ele funciona ...
De 15.1.2.2 parseInt (string , radix)
:
Quando a função parseInt é chamada, são executadas as seguintes etapas:
- Deixe inputString ser ToString (string).
- Seja S uma substring recém-criada de inputString que consiste no primeiro caractere que não é um StrWhiteSpaceChar e em todos os caracteres após esse caractere. (Em outras palavras, remova o espaço em branco à esquerda.)
- Let sign seja 1.
- Se S não estiver vazio e o primeiro caractere de S for um sinal de menos -, deixe o sinal ser -1.
- Se S não estiver vazio e o primeiro caractere de S for um sinal de mais + ou um sinal de menos -, remova o primeiro caractere de S.
- Seja R = ToInt32 (raiz).
- Seja stripPrefix verdadeiro.
- Se R ≠ 0, então a. Se R <2 ou R> 36, retorne NaN. b. Se R 16, deixe stripPrefix ser falso.
- Senão, R = 0 a. Seja R = 10.
- Se stripPrefix for true, então a. Se o comprimento de S for pelo menos 2 e os dois primeiros caracteres de S forem "0x" ou "0X", remova os dois primeiros caracteres de S e deixe R = 16.
- Se S contiver algum caractere que não seja um dígito radix-R, seja Z a substring de S que consiste em todos os caracteres antes do primeiro caractere; caso contrário, seja Z S.
- Se Z estiver vazio, retorne NaN.
- Seja mathInt o valor inteiro matemático que é representado por Z na notação radix-R, usando as letras AZ e az para dígitos com valores de 10 a 35. (No entanto, se R for 10 e Z contiver mais de 20 dígitos significativos, todos os significantes dígito após o dia 20 pode ser substituído por um dígito 0, na opção da implementação; e se R não for 2, 4, 8, 10, 16 ou 32, então mathInt pode ser uma aproximação dependente da implementação do número inteiro matemático valor que é representado por Z na notação radix-R.)
- Seja number o valor numérico para mathInt.
- Sinal de retorno × número.
NOTA parseInt pode interpretar apenas uma parte inicial da string como um valor inteiro; ele ignora qualquer caractere que não possa ser interpretado como parte da notação de um número inteiro e nenhuma indicação é dada de que esses caracteres foram ignorados.
Existem duas partes importantes aqui. Eu coloquei os dois em negrito. Então, primeiro de tudo, temos que descobrir qual é a toString
representação de null
. Precisamos examinar Table 13 — ToString Conversions
na seção 9.8.0 essas informações:
Ótimo, agora sabemos que fazer toString(null)
internamente produz uma 'null'
string. Ótimo, mas como exatamente ele lida com dígitos (caracteres) que não são válidos dentro da raiz fornecida?
Observamos acima 15.1.2.2
e vemos a seguinte observação:
Se S contiver algum caractere que não seja um dígito radix-R, seja Z a substring de S que consiste em todos os caracteres antes do primeiro caractere; caso contrário, seja Z S.
Isso significa que lidamos com todos os dígitos ANTES do radical especificado e ignoramos todo o resto.
Basicamente, fazer parseInt(null, 23)
é a mesma coisa que parseInt('null', 23)
. Isso u
faz com que os dois l
sejam ignorados (mesmo que sejam parte da base 23). Portanto, só podemos analisar n
, tornando a declaração inteira sinônimo de parseInt('n', 23)
. :)
De qualquer maneira, ótima pergunta!