As chamadas para parseIntdevem sempre especificar uma base no segundo argumento:
parseInt("08", 10);
Versões anteriores de JavaScript tratam strings começando com 0como octal (quando nenhuma base é especificada) e nem 08nem09 são números octais válidos.
Da documentação do Mozilla :
Se radix for indefinido ou 0, JavaScript assume o seguinte:
- Se a string de entrada começar com "0x" ou "0X", a raiz é 16 (hexadecimal).
- Se a string de entrada começar com "0", a raiz é oito (octal). Este recurso não é padrão e algumas implementações deliberadamente não o suportam (em vez de usar o radical 10). Por esse motivo, sempre especifique uma raiz ao usar parseInt .
- Se a string de entrada começar com qualquer outro valor, a raiz será 10 (decimal).
Se o primeiro caractere não puder ser convertido em um número, parseInt retornará NaN.
E a partir do padrão ECMAScript 3 :
Quando a raiz é 0 ou indefinida e o número da string começa com um
dígito 0 não seguido por um x ou X , a implementação pode, a seu critério, interpretar o número como octal ou como decimal. As implementações são encorajadas a interpretar os números, neste caso, como decimais.
A versão mais recente do JavaScript ( ECMAScript 5 ) abandona esse comportamento , mas você ainda deve especificar a raiz para satisfazer os navegadores mais antigos.