Comment vérifier NaN dans JavaScript

Vérifier NaN (« pas un nombre ») est aussi simple que vérifier l’auto-égalité dans JavaScript.

Dr Derek Austin 🥳

Suivre

15 sept. 2019 · 4 min de lecture

Photo de Rattap sur Unsplash

En JavaScript, la valeur spéciale NaN (signifiant » pas un nombre « ) est utilisée pour représenter le résultat d’un calcul mathématique qui ne peut pas être représenté par un nombre significatif. – Joshua Clanton sur A Drip of JavaScript

La valeur spéciale NaN apparaît dans JavaScript lorsque Math les fonctions échouent (Math.sqrt(-37)) ou lorsqu’une fonction essayant d’analyser un nombre échoue (parseInt("No integers here")).

NaN empoisonne alors toutes les autres fonctions mathématiques, conduisant à toutes les autres opérations mathématiques résultant en NaN.

Photo de Chris Barbalis sur Unsplash

Notez qu’en JavaScript, la division par 0 renvoie Infinity, pas NaN:

Ce résultat est dû à la façon dont flottant-poi nt est défini, plus généralement que juste Javascript. Pourquoi? En gros, parce que 1/0 est la limite de 1 / x lorsque x s’approche de zéro. Et 0/0 n’a aucune interprétation raisonnable du tout, d’où NaN.

Qu’est-ce que NaN de toute façon?

NaN est une propriété de l’objet global. La valeur initiale de NaN est Not-A-Number – la même que la valeur de Number.NaN. – MDN Docs

Photo par Andrew Buchanan sur Unsplash

Vérifier NaN est plus difficile qu’il n’y paraît

Malheureusement, il y a deux problèmes à essayer de vérifier NaN:

  1. Le typeof NaN est un » nombre « 
  2. NaN est différent de toutes les autres valeurs en JavaScript

Consultez cet exemple de code:

Alors, comment vérifier si nous avons une valeur NaN qui empoisonnera les mathématiques?

Photo de Wolfgang Rottmann sur Unsplash

Rechercher NaN avec auto-égalité

 » NaN, et seul NaN, se comparera inégal à lui-même.  » – MDN Docs

En JavaScript, la meilleure façon de vérifier NaN est de vérifier l’auto-égalité en utilisant l’un des opérateurs d’égalité intégrés, == ou ===.

Parce que NaN n’est pas égal à lui-même, NaN != NaN renverra toujours true.

Bien sûr, un tel test NaN dans votre code n’est pas toujours lisible, c’est donc une bonne idée d’utiliser un commentaire ou de créer une fonction wrapper:

Cela ne fait aucune différence si vous utilisez != ou !== pour rechercher NaN.

Photo par Erik Mclean sur Unsplash

Rechercher NaN avec Object.is ()

 » Le Object.is() détermine si deux valeurs ont la même valeur.”- MDN Docs

Contrairement aux opérateurs d’égalité stricts et lâches, la méthode d’assistance ES6 Object.is() ne prend pas en compte NaN pour être égal à lui-même:

Donc, si vous remplacez === par Object.is(), vous n’aurez jamais à vous inquiéter à propos de la vérification de NaN d’une manière spéciale. Problème résolu!

J’ai écrit sur la façon d’utiliser Object.is() en JavaScript dans un autre article:

Une note sur la terminologie – Object.is() est une fonction de la classe globale Object, je ne l’appelle pas un « opérateur d’égalité » comme == ou ===.

Par exemple, dans les tests Jest, la méthode .toBe() qui utilise === est différent de la méthode .toEqual() qui utilise Object.is().

Pour conclure ici, je dois mentionner qu’un JavaScript ES6 Set, qui est utilisé pour trouver des valeurs uniques, ne conservera jamais qu’une seule copie d’un NaN valeur.

Photo de Tony Hand sur Unsplash

Un mot sur Number .isNan ()

Le JavaScript moderne a déjà une implémentation pour vérifier NaN appelée Number.isNan() qui fonctionne comme vous le pensez ce serait. Par exemple:

Notez que Number.isNan() est différent de la fonction globale isNan(), qui est une implémentation plus ancienne dont le but réel est de vérifier si une valeur ne peut pas être forcée à un nombre.

Voici la différence, par souci d’exhaustivité:

  • isNaN() renverra true si la valeur est actuellement NaN, ou si elle va être NaN après avoir été forcée à un nombre. En d’autres termes, s’il reçoit une valeur qui peut être forcée à un nombre, isNaN () renverra faux.
  • Number.isNaN() renverra true uniquement si la valeur est actuellement NaN.

Donc, si vous prenez en charge d’anciens navigateurs (en particulier Internet Explorer) qui ne prennent pas en charge Number.isNan(), il est préférable de vérifier l’auto-égalité.

Photo par Nick Hillier sur Unsplash

Leave a Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *