ESLint Uso inesperado de isNaN

154

Estou tentando usar a isNaNfunção global dentro de uma função de seta em um módulo Node.js., mas estou recebendo este erro:

[eslint] Unexpected use of 'isNaN'. (no-restricted-globals)

Este é o meu código:

const isNumber = value => !isNaN(parseFloat(value));

module.exports = {
  isNumber,
};

Alguma idéia do que estou fazendo de errado?

PS: Estou usando o guia de estilo AirBnB.

Elias Garcia
fonte

Respostas:

282

Como a documentação sugere , use Number.isNaN.

const isNumber = value => !Number.isNaN(Number(value));

Citando a documentação do Airbnb:

Por quê? O isNaN global restringe não-números a números, retornando verdadeiro para qualquer coisa que impeça o NaN. Se esse comportamento for desejado, torne explícito.

// bad
isNaN('1.2'); // false
isNaN('1.2.3'); // true

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true
Andy Gaskell
fonte
28
Mas isNaNe Number.isNaNnão são as mesmas funções. Por exemplo isNaN('1a') true Number.isNaN('1a') false
rosencreuz
3
@rosencreuz Mais como comportamento indesejado. É por isso que existe Number('1.2.3')no exemplo acima.
Patrick Portal
2
Que regra estúpida, o ponto principal é coagir a um número ou você pode simplesmente fazer uma typeofverificação.
Dominic
Eu uso o Number.isNaN(+'1.2.3')que é apenas um extra +se você usarNumber.isNaN
Ibraheem
16

Para sua informação, isso não funcionará para o IE. Verifique aqui na compatibilidade do navegador.

thyforhtian
fonte
3

@ Andy Gaskell isNumber('1.2.3')retornar true, convém editar sua resposta e usá-la Number()no lugar deparseFloat()

    const isEmpty = value => typeof value === 'undefined' || value === null || value === false;
    const isNumeric = value => !isEmpty(value) && !Number.isNaN(Number(value));
  console.log(isNumeric('5')); // true
  console.log(isNumeric('-5')); // true
  console.log(isNumeric('5.5')); // true
  console.log(isNumeric('5.5.5')); // false
  console.log(isNumeric(null)); // false
  console.log(isNumeric(undefined)); // false
Vincent Baronnet
fonte
Acabei de perceber essa resposta agora. Minha resposta foi atualizada, obrigado!
Andy Gaskell
1

No meu caso, eu queria tratar 5 (inteiro), 5,4 (decimal), '5', '5,4' como números, mas nada mais, por exemplo.

Se você tiver requisitos semelhantes, abaixo pode funcionar melhor:

const isNum = num => /^\d+$/.test(num) || /^\d+\.\d+$/.test(num);

//Check your variable if it is a number.
let myNum = 5;
console.log(isNum(myNum))

Para incluir números negativos:

const isNum = num => /^-?\d+$/.test(num) || /^-?\d+\.\d+$/.test(num);

Isso removerá o problema de uso global de isNaN também. Se você converter a função isNum em uma função normal do ES5, ela também funcionará no navegador IE.

Noby Fujioka
fonte
0

Para mim, isso funcionou bem e não teve nenhum problema com o ESlint

window.isNaN()

Yoannes Geissler
fonte
Usando o padrão AirBnb, você deve obter: ESLint: 'window.isNaN' não pode ser usado. Em vez disso, use Number.isNaN (propriedades sem restrições)
Bartek Maciejewski
@BartekMaciejewski O problema com Number.isNaN é que elas não são as mesmas funções. Por exemplo. Number.isNaN('abc')é false. E isNaN('abc')étrue
Yoannes Geissler
Sim, concordo totalmente com você - só queria mencionar que o uso window.isNan()é contra a configuração de outros AirBnb (a regra é eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski
@BartekMaciejewski Isso é uma dor, infelizmente tive que desativar o no-restricted-propertiespor causa desse problema
Yoannes Geissler 24/02