188 votes

ESLint Utilisation inattendue de isNaN

J'essaie d'utiliser le isNaN à l'intérieur d'une fonction 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 sur ce que je fais mal ?

PS : J'utilise le guide de style AirBnB.

342voto

Andy Gaskell Points 15264

Comme le La documentation suggère utiliser Number.isNaN .

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

Je cite la documentation d'Airbnb :

Pourquoi ? Le global isNaN transforme les non-nombres en nombres, en retournant vrai pour tout ce qui est converti en 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

34 votes

Mais isNaN y Number.isNaN ne sont pas les mêmes fonctions. Par exemple isNaN('1a') true Number.isNaN('1a') false

3 votes

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

5 votes

Quelle règle stupide, le but est de contraindre à un nombre ou vous pourriez tout aussi bien faire un typeof vérifier.

18voto

thyforhtian Points 243

Pour info, cela ne fonctionnera pas pour IE. Vérifiez aquí à la compatibilité des navigateurs.

6voto

@Andy Gaskell isNumber('1.2.3') retourner true vous pourriez modifier votre réponse et utiliser Number() à la place de parseFloat()

    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

0 votes

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

2voto

Noby Fujioka Points 402

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 les mêmes exigences, le modèle ci-dessous peut être plus efficace :

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 les nombres négatifs :

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

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

0voto

Yoannes Geissler Points 645

Pour moi, cela a bien fonctionné et je n'ai pas eu de problème avec ESlint.

window.isNaN()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X