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.

Elias Garcia
la source

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
Andy Gaskell
la source
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
16

FYI, cela ne fonctionnera pas pour IE. Vérifiez ici la compatibilité du navigateur.

thyforhtian
la source
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
Vincent Baronnet
la source
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.

Noby Fujioka
la source
0

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

window.isNaN()

Yoannes Geissler
la source
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