ESLint Utilisation inattendue de isNaN


155

J'essaie d'utiliser la isNaNfonction globale dans une fonction de flèche dans un module Node.js mais j'obtiens cette erreur:

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

Voici mon code:

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

module.exports = {
  isNumber,
};

Une idée de ce que je fais mal?

PS: J'utilise le guide de style AirBnB.

Réponses:


283

Comme le suggère la documentation , utilisez Number.isNaN.

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

Citant la documentation d'Airbnb:

Pourquoi? L'isNaN global contraint les non-nombres à des nombres, retournant vrai pour tout ce qui contraint à NaN. Si ce comportement est souhaité, rendez-le explicite.

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

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true

28
Mais isNaNet Number.isNaNne sont pas les mêmes fonctions. Par exemple isNaN('1a') true Number.isNaN('1a') false
rosencreuz

3
@rosencreuz Plus comme un comportement indésirable. C'est pourquoi il y en a Number('1.2.3')dans l'exemple ci-dessus.
Patrick Portal

2
Quelle règle stupide, le but est de contraindre à un nombre ou vous pourriez aussi bien faire un typeofcontrôle.
Dominic

J'utilise Number.isNaN(+'1.2.3')qui est juste un extra +si vous utilisezNumber.isNaN
Ibraheem


3

@Andy Gaskell isNumber('1.2.3')revient true, vous voudrez peut-être modifier votre réponse et utiliser Number()à la place 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

Je viens de remarquer cette réponse maintenant. Ma réponse a été mise à jour, merci!
Andy Gaskell

1

Dans mon cas, je voulais traiter 5 (entier), 5,4 (décimal), «5», «5,4» comme des nombres mais rien d'autre par exemple.

Si vous avez des exigences similaires, ci-dessous peut mieux fonctionner:

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))

Pour inclure des nombres négatifs:

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

Cela supprimera également votre problème d'utilisation globale d'isNaN. Si vous convertissez la fonction isNum en fonction ES5 normale, elle fonctionnera également sur le navigateur IE.


0

Pour moi, cela a bien fonctionné et n'a eu aucun problème avec ESlint

window.isNaN()


En utilisant la norme AirBnb, vous devriez obtenir: ESLint: 'window.isNaN' ne peut pas être utilisé. Veuillez utiliser Number.isNaN à la place (no-restricted-properties)
Bartek Maciejewski

@BartekMaciejewski Le problème avec Number.isNaN est que ce ne sont pas les mêmes fonctions. Par exemple. Number.isNaN('abc')est false. And isNaN('abc')istrue
Yoannes Geissler le

Oui, je suis totalement d'accord avec vous - je voulais juste mentionner que l'utilisation window.isNan()est contre la configuration d'autres AirBnb (la règle est eslint.org/docs/rules/no-restricted-properties )
Bartek Maciejewski

@BartekMaciejewski C'est une douleur, j'ai malheureusement dû désactiver le à no-restricted-propertiescause de ce problème
Yoannes Geissler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.