Javascript parseInt () com zeros à esquerda

A function parseInt do Javascript não parece funcionar completamente.

parseInt("01") returns 1 parseInt("02") returns 2 parseInt("03") returns 3 parseInt("04") returns 4 parseInt("05") returns 5 parseInt("06") returns 6 parseInt("07") returns 7 parseInt("08") returns 0 parseInt("09") returns 0 

Você não pode explicar isso. De uma chance. (jsFiddle)

Editar Desde que esta pergunta foi perguntada e respondida, o “recurso” de padronizar para octal radix foi preterido. [ 1 ] [ 2 ]

Isso porque, se um número começa com um ‘0’, ele é tratado como base 8 (octal).

Você pode forçar a base passando a base como o segundo parâmetro.

 parseInt("09", 10) // 9 

De acordo com os documentos , o segundo parâmetro é opcional, mas nem sempre é considerado como 10, como você pode ver no seu exemplo.

Chamadas para parseInt sempre devem especificar uma base no segundo argumento:

 parseInt("08", 10); 

Versões anteriores do JavaScript tratam cadeias começando com 0 como octal (quando nenhuma base é especificada) e nem 08 nem 09 são números octal válidos.

Da documentação do Mozilla:

Se radix for indefinido ou 0, o JavaScript assume o seguinte:

  • Se a cadeia de input começar com “0x” ou “0X”, a base é 16 (hexadecimal).
  • Se a cadeia de input começar com “0”, a raiz é oito (octal). Esse recurso não é padrão e algumas implementações deliberadamente não o suportam (em vez disso, usam a raiz 10). Por esse motivo, sempre especifique um radical ao usar parseInt .
  • Se a string de input começar com qualquer outro valor, a raiz é 10 (decimal).

Se o primeiro caractere não puder ser convertido em um número, parseInt retornará NaN.

E do padrão ECMAScript 3 :

Quando radix é 0 ou indefinido 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 sendo octal ou como decimal. Implementações são encorajadas a interpretar números neste caso como sendo decimal.

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.

Existe um parâmetro Radix

 parseInt(value, base) 

Onde base é o radical.

Neste caso você está avaliando números base10 (decimal), portanto use

 parseInt(value, 10); 

Isso não parece ser completamente válido em novos navegadores. O Internet Explorer 9 e 10 retornará 8 se você executar ‘parseInt (“08”)’, enquanto o Internet Explorer 8 e as versões anteriores retornarão 0 (o IE10 no modo quirks também retornará 0).

A versão mais recente do Chrome também retorna 8, portanto, eles devem ter alterado a interpretação recentemente.

Este problema está obsoleto agora. Mas você ainda pode usar o radix em parseInt para converter o número de outras bases em base-10. Por exemplo,

 var baseTwoNumber = parseInt('0010001', 2); 

retorna 17 (que é base-10 de 0010001 ).

Dica: Como você sabe agora, quando o padrão para octal foi descontinuado. Aqui está como você iria corrigi-lo em navegadores herdados

 // ES-5 15.1.2.2 if (parseInt('08') !== 8 || parseInt('0x16') !== 22) { parseInt = (function (origParseInt) { var hexRegex = /^0[xX]/; return function parseIntES5(str, radix) { str = String(str).trim(); if (!Number(radix)) { radix = hexRegex.test(str) ? 16 : 10; } return origParseInt(str, radix); }; }(parseInt)); } 

O problema parece ter mudado agora na maioria dos navegadores.

Firefox 51.0.1 (64 bits)

 parseInt("09") // 9 

Chrome 55.0.2883.95 (64 bits)

 parseInt("09") // 9 

Safari 10.0 (12602.1.50.0.10)

 parseInt("09") // 9 

=====

Prática Recomendada

Dito isto, apenas para estar no lado mais seguro e evitar problemas, use o parâmetro base / radix como sugerido na resposta aceita .

 parseInt("09", 10) // 9 

Teste extra

Eu só queria testar isso também, se o argumento não for uma string. Chrome e Safari dão resultado exato. O Firefox também retorna um resultado adequado, mas com um aviso.

 parseInt(09) // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)