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 NaN
est un » nombre « -
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?
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()
renverratrue
si la valeur est actuellementNaN
, ou si elle va êtreNaN
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()
renverratrue
uniquement 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é.