Depuis les toutes premières versions de la spécification de la fonction isNaN
, son comportement pour les arguments non numériques est déroutant. Lorsque l’argument de la fonction isNaN
n’est pas de type Number, la valeur est d’abord forcée en Number. La valeur résultante est ensuite testée pour déterminer s’il s’agit de NaN
. Ainsi, pour les non-nombres qui, lorsqu’ils sont forcés au type numérique, aboutissent à une valeur numérique non NaN valide (notamment la chaîne vide et les primitives booléennes, qui lorsqu’elles sont forcées donnent des valeurs numériques zéro ou un), la valeur renvoyée « false » peut être inattendue; la chaîne vide, par exemple, n’est sûrement « pas un nombre ». La confusion vient du fait que le terme «pas un nombre» a une signification spécifique pour les nombres représentés comme des valeurs à virgule flottante IEEE-754. La fonction doit être interprétée comme répondant à la question, « est-ce que cette valeur, lorsqu’elle est forcée à une valeur numérique, est une valeur IEEE-754 » Not A Number « ? »
ECMAScript 2015 contient le . Number.isNaN(x)
est un moyen fiable de tester si x
est NaN
ou non. Même avec Number.isNaN
, cependant, la signification de NaN
reste la signification numérique précise et non, « pas un nombre ». Sinon, en l’absence de Number.isNaN
, l’expression (x != x)
est un moyen plus fiable de tester si la variable x
est NaN
ou non, car le résultat n’est pas soumis aux faux positifs qui rendent isNaN
peu fiable.
Un polyfill pour isNaN
serait (le polyfill exploite la caractéristique unique jamais égal à lui-même de NaN
):