Tente executar o seguinte em JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Acabei de aprender da maneira mais difícil que o JavaScript pensa que o zero inicial indica um número inteiro octal e, como não existe "8"
ou "9"
na base 8, a função retorna zero. Goste ou não, isso ocorre por design .
Quais são as soluções alternativas?
Nota: Por uma questão de integridade, estou prestes a postar uma solução, mas é uma solução que eu odeio, portanto, publique outras / melhores respostas.
Atualizar:
A 5ª edição do padrão JavaScript ( ECMA-262 ) apresenta uma alteração de última hora que elimina esse comportamento. Mozilla tem uma boa redação .
10
(decimal), a menos que o número a ser analisado seja prefixado 0x
, por exemplo 0xFF
, nesse caso, o parâmetro base é padronizado como 16. Felizmente, um dia, esse problema será uma memória distante.
+'08' === 8
? Verdade! Talvez você realmente precise parseInt
do seu código real, mas não do acima.
Number('08')
0
ou undefined
e o número da string começa com um 0
dígito não seguido por um x
ou X
, então a implementação pode, a seu critério, interpretar o número como octal ou decimal. As implementações são incentivadas a interpretar números nesse caso como decimais. " ( minha ênfase)