JSLint diz "falta de parâmetro radix"

538

Eu executei o JSLint neste código JavaScript e ele disse:

Problema na linha 32, caractere 30: Parâmetro radix ausente.

Este é o código em questão:

imageIndex = parseInt(id.substring(id.length - 1))-1;

O que há de errado aqui?

Mike Vierwind
fonte

Respostas:

967

Sempre é uma boa prática transmitir radix com parseInt -

parseInt(string, radix)

Para decimal -

parseInt(id.substring(id.length - 1), 10)

Se o parâmetro radix for omitido, o JavaScript assumirá o seguinte:

  • Se a sequência começar com "0x", a raiz será 16 (hexadecimal)
  • Se a sequência começar com "0", a raiz será 8 (octal). Este recurso está obsoleto
  • Se a sequência começar com qualquer outro valor, a raiz será 10 (decimal)

( Referência )

Jayendra
fonte
7
Pelo que parece, o padrão é 10. Se não começar com 0x ou 0, o padrão será uma raiz de 10. Mas é uma prática recomendada especificar uma raiz mesmo que seja o valor padrão, como especificando a definição de "this" para uma função array.map.
molson504x
81
isso é tão irracional ... por essa lógica deve haver uma terceira param para representar a raiz do argumento raiz em si
Nishant
6
Concorde com outros comentadores. Por que é bom fornecer um valor de radix quando o padrão é 10? Isso desafia a convenção comum.
Richard Clayton
9
Adicione 10 como a raiz para obter outro erro de cotão ... Redundant radix parameter
Shanimal
2
@ Nishant: o radixargumento é um valor numérico, não uma representação de seqüência de caracteres de um valor numérico, portanto, não há raiz para especificar.
tokland
79

Para evitar esse aviso, em vez de usar:

parseInt("999", 10);

Você pode substituí-lo por:

Number("999");


Observe que parseInt e Number têm comportamentos diferentes , mas em alguns casos, um pode substituir o outro.

Zanon
fonte
4
Também existem grandes diferenças de desempenho entre parseInte Number. Aqui está um teste de desempenho antigo .
Josh Unger
3
Chrome 77: Number()é 6x mais rápido do queparseInt()
Zanon
1
Esta é uma solução limpa que funciona muito bem.
thanos.a 12/04
43

Não estou respondendo adequadamente à pergunta, mas acho que faz sentido esclarecer por que devemos especificar a raiz .

Na documentação do MDN, podemos ler o seguinte:

Se a raiz for indefinida ou 0 (ou ausente), o JavaScript assumirá o seguinte:

  • [...]
  • Se a sequência de entrada começar com "0", a raiz será oito (octal) ou 10 (decimal). Exatamente qual o radical escolhido é dependente da implementação. O ECMAScript 5 especifica que 10 (decimal) é usado, mas nem todos os navegadores ainda suportam isso. Por esse motivo, sempre especifique um radical ao usar parseInt.
  • [...]

Fonte: MDN parseInt ()

nmoliveira
fonte
1
Sim, mas o compilador Typescript irá inseri-lo. Por que você deveria se preocupar?
Spock
2
@ Spock Porque o TSLint reclama que não está lá. E no buraco do coelho vamos nós ...
msanford
Sim, é verdade .. é por isso que desabilito esta regra de fiapos. Ainda não entendo por que um parâmetro opcional viagens de uma queixa fiapos .. oh bem
Spock
4
@Spock Sempre especifique este parâmetro para eliminar a confusão do leitor e garantir um comportamento previsível. Implementações diferentes produzem resultados diferentes quando uma raiz não é especificado, geralmente falta o valor para 10. Referência
Andrew Lam
27

Você pode desativar esta regra se desejar pular esse teste.

Inserir:

radix: false

Sob a rulespropriedade " " no tslint.jsonarquivo.

Não é recomendável fazer isso se você não entender essa exceção.

Spock
fonte
1
Eu vou usar isso desde código é executado muito bem sem Radix
William
22

Adicionar o seguinte no topo do seu arquivo JS informará o JSHint para suprimir o aviso de raiz:

/*jshint -W065 */

Consulte também: http://jshint.com/docs/#options

aleemb
fonte
2
A que opção jshint isso corresponde? Estou usando o SublimeLint para executar o jshint no meu editor, e só é necessário um hash de opção: pares de valores para a configuração, portanto, acho que não posso aplicar sua sugestão "-W065".
Dihedral
5
Você pode usar "-W065": true, por exemplo, em um .jshintrcarquivo.
Alexfernandez # 25/13
29
-1 Por favor, não faça isso, basta adicionar o radix que você deseja analisar
Juan Mendes
Quanto mais fortemente tipada for uma linguagem, maiores serão as oportunidades de otimização do compilador, e é por isso que está lançando o aviso.
HoldOffHunger
3
no JS moderno, a adição da raiz pela IMO torna mais claro o que a função está fazendo. Está na posição em que você pode esperar um padrão se não souber a assinatura da função. Não faz sentido que você precise especificar um radical.
Charles Offenbacher
5

Eu o resolvi usando apenas o + foo, para converter a string.

Lembre-se de que não é ótimo para legibilidade (correção suja).

console.log( +'1' )
// 1 (int)
user2369834
fonte
3

Você também pode simplesmente adicionar esta linha logo acima da sua linha parseInt:

// eslint-disable-next-line

Isso desativará a verificação do eslint para a próxima linha. Use isso se você precisar apenas pular uma ou duas linhas.

Rohit Nethi
fonte
2

Basta colocar uma string vazia no local do radical, porque parseInt () recebe dois argumentos:

parseInt (string, raiz);

string O valor a analisar. Se o argumento da string não for uma string, ele será convertido em uma string (usando a operação abstrata ToString). O espaço em branco à esquerda no argumento da string é ignorado.

radix Um número inteiro entre 2 e 36 que representa o radical (a base nos sistemas de números matemáticos) da string mencionada acima. Especifique 10 para o sistema numeral decimal comumente usado por seres humanos. Sempre especifique este parâmetro para eliminar a confusão do leitor e garantir um comportamento previsível. Implementações diferentes produzem resultados diferentes quando um radical não é especificado, geralmente padronizando o valor para 10.

imageIndex = parseInt (id.substring (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;

Ahmed.Dz
fonte
2

Simplesmente adicione sua regra personalizada em .eslintrc, que se parece com isso, "radix": "off" e você estará livre deste aviso de falta de manutenção. Isto é para o linter eslint.

Goran_Ilic_Ilke
fonte
1

Antes do ECMAScript 5, parseInt () também identificava literais octais automaticamente, o que causava problemas porque muitos desenvolvedores supunham que um 0 inicial fosse ignorado.

Então, em vez de:

var num = parseInt("071");      // 57

Faça isso:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

Referência

SanTom
fonte
0

Em vez de chamar a substringfunção, você poderia usar.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

Aqui, -1 na fatia indica que, para iniciar a fatia a partir do último índice.

Obrigado.

Daniel
fonte