Vérifier NaN (« pas un nombre ») est aussi simple que vérifier l’auto-égalité dans JavaScript.
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.
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
Vérifier NaN est plus difficile qu’il n’y paraît
Malheureusement, il y a deux problèmes à essayer de vérifier NaN:
- Le
typeof NaNest un » nombre « -
NaNest 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?
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.
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.
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()renverratruesi la valeur est actuellementNaN, ou si elle va êtreNaNaprè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()renverratrueuniquement si la valeur est actuellementNaN.
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é.