Tudo bem, então eu estava brincando com o parseInt para ver como ele lida com valores ainda não inicializados e me deparei com essa gema. O seguinte acontece para qualquer raiz 24 ou superior.
parseInt(null, 24) === 23 // evaluates to true
Eu testei no IE, Chrome e Firefox e todos eles alertam como verdadeiros, então acho que deve estar na especificação em algum lugar. Uma rápida pesquisa no Google não me deu nenhum resultado, então aqui estou, esperando que alguém possa explicar.
Lembro-me de ouvir um discurso de Crockford em que ele estava dizendo typeof null === "object"
por causa de uma supervisão que fazia com que Object e Null tivessem um identificador de tipo quase idêntico na memória ou algo nesse sentido, mas não consigo encontrar esse vídeo agora.
Experimente: http://jsfiddle.net/robert/txjwP/
Correção de edição : um radical mais alto retorna resultados diferentes, 32 retorna 785077
Edit 2 From zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Explique por que parseInt(null, 24) === 23
é uma afirmação verdadeira.
fonte
alert(parseInt(null, 34) === 23)
produzidofalse
alert(parseInt(null,26)===23);
também produz true?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
como o primeiro parâmetro retorna resultados estranhos para os anos 30Respostas:
Está convertendo
null
para a string"null"
e tentando convertê-la. Para radixes de 0 a 23, não há números que possam ser convertidos e, portanto, ele retornaNaN
. Aos 24,"n"
a 14ª letra é adicionada ao sistema numérico. Em 31,"u"
a 21ª letra é adicionada e a cadeia inteira pode ser decodificada. Aos 37 anos, não há mais nenhum conjunto de números válido que possa ser gerado e o NaN é retornado.fonte
toString()
?Mozilla nos diz :
Na especificação , 15.1.2.2/1 nos diz que a conversão em string é realizada usando o built-in
ToString
, que (conforme 9.8) produz"null"
(não deve ser confundido com otoString
que produziria"[object Window]"
!).Então, vamos considerar
parseInt("null", 24)
.Obviamente, essa não é uma string numérica de base 24 por inteiro, mas "n" é: é 23 decimal .
Agora, a análise é interrompida depois que o decimal 23 é retirado, porque
"u"
não é encontrado no sistema base-24:(E é por isso que
parseInt(null, 23)
(e radices mais baixos) fornecem a você, emNaN
vez de 23:"n"
não está no sistema base-23.)fonte
Ignacio Vazquez-Abrams está correto, mas vamos ver exatamente como ele funciona ...
De
15.1.2.2 parseInt (string , radix)
:Existem duas partes importantes aqui. Eu coloquei os dois em negrito. Então, primeiro de tudo, temos que descobrir qual é a
toString
representação denull
. Precisamos examinarTable 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: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 queparseInt('null', 23)
. Issou
faz com que os doisl
sejam ignorados (mesmo que sejam parte da base 23). Portanto, só podemos analisarn
, tornando a declaração inteira sinônimo deparseInt('n', 23)
. :)De qualquer maneira, ótima pergunta!
fonte
É equivalente a
que é equivalente a
Os dígitos da base 24 são 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
A especificação do idioma diz
que é a parte que garante que literais inteiros no estilo C
15L
analisem corretamente, portanto, o acima é equivalente a"n"
é a 23ª letra da lista de dígitos acima.QED
fonte
Eu acho que
null
é convertido em uma string"null"
. Então, nan
verdade, está23
em 'base24' (o mesmo em 'base25' +),u
é inválido em 'base24', portanto o restante da stringnull
será ignorado. É por isso que ele produz23
até queu
se torne válido em 'base31'.fonte
parseInt usa representação alfanumérica; em seguida, na base-24 "n" é válido, mas "u" é um caractere inválido, então parseInt analisa apenas o valor "n" ....
como exemplo, tente com isso:
O resultado será "3".
fonte