web-dev-qa-db-fra.com

NaN est-il égal à NaN?

parseFloat("NaN")

renvoie "NaN", mais

parseFloat("NaN") == "NaN"

renvoie faux. Maintenant, c'est probablement une bonne chose que cela retourne false, mais je ne comprends pas comment c'est. Les créateurs de JavaScript ont-ils simplement fait de cela un cas particulier? Parce que sinon je ne peux pas comprendre comment cela retourne faux.

42
joseph

Lorsqu'une fonction JavaScript renvoie NaN, il ne s'agit pas d'une chaîne littérale, mais d'une propriété d'objet dans l'espace global. Vous ne pouvez pas le comparer à la chaîne "NaN".

Voir https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

33
Phil

Mise à jour 2

La nouveauté d’ECMAScript 6 est la fonction Object.is () . Ceci est conçu pour être une amélioration supplémentaire de la vérification ===. L'un des avantages de cette nouvelle fonction est que Object.is(NaN, NaN) retournera maintenant la valeur true. Si vous êtes capable d'utiliser ECMAScript 6 , cette solution est la plus lisible et la plus cohérente pour vous.

Original

La bonne façon de vérifier cela serait:

isNaN(parseInt(variable))

Si tout ce que vous vérifiez est un NaN, cette fonction retournera true. Cette méthode est intégrée à la spécification JavaScript.

Utilisation de jQuery

jQuery a créé sa propre fonction isNaN à l'origine pour aider à contrer certaines divergences entre les navigateurs et ajouter quelques vérifications supplémentaires afin que leur version puisse être utilisée à la place de celle de VanillaJS.

Mise à jour pour jQuery

Après jQuery 1.7, ils ont changé cette fonction en $.isNumeric() .

Documentation du commutateur

Si vous jetez un coup d'œil à cette question de débordement de pile , vous verrez qu'il y a de nombreuses fois où isNaN() renvoie ce qui serait intuitivement considéré comme une réponse "incorrecte", mais conforme aux spécifications.

L’une des principales raisons d’éviter le paramètre isNaN() de Vanilla est que null renverra false, ce qui vous fera penser qu’il s’agit d’un nombre. Cependant, la fonction jQuery couvre une gamme beaucoup plus étendue de résultats intuitifs.

De leur documentation:

À partir de jQuery 3.0, $ .isNumeric () ne renvoie vrai que si l’argument est de numéro de type, ou si c'est du type chaîne et qu'il peut être forcé dans nombres finis. Dans tous les autres cas, il retourne faux.

33
krillgar

C'est un cas spécial, NaN est la seule chose en Javascript qui ne soit pas égale à elle-même.

Bien que les autres réponses à propos des chaînes par rapport à l'objet NaN soient également correctes.

33
shelman

NaN est l'un des rares exemples d'objet qui n'est pas égal à lui-même. En fait, cette propriété même est utilisée pour implémenter la méthode bool IsNaN(number) commune:

function isNaN(x)
{ 
    return x != x; 
}
10
Martin Devillers
  • Lorsque Number (renvoyé par ParseFloat) est comparé à stringstring converti en Number
  • NaN n'est égal à aucun autre objet (y compris NaN)

Vous obtenez NaN==NaN. C'est faux par seconde règle.

8
RiaD

isNaN fonctionne pour toutes les valeurs qui ne sont pas des nombres

isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true

Si, toutefois, vous voulez vérifier spécifiquement la variable NaN, ou éviter la contrainte de type;
vous pouvez utiliser Number.isNaN à la place

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
5
Electric Coffee

Dans ECMAScript 6, Object.is () est une amélioration de === . Cette méthode accepte deux arguments et renvoie true si les valeurs sont équivalentes.Et les deux valeurs sont considérées comme équivalentes lorsqu'elles sont du même type et ont même valeur . C'est la raison pour laquelle console.log (Object.is (NaN, NaN)) -> TRUE

1
SatoK

Je travaille avec Google Apps Script et je suis donc coincé avec ECMA 5. Semblable à la réponse de Electric Coffee, voici ce que j’ai pu comprendre qui semble donner une réponse sûre quant à savoir si une valeur est réellement NaN pas si une valeur est NaN mais si elle est réellement NaN elle-même:

function isThisNaN(x)
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
}
console.log(isThisNaN(NaN)); // true

lol Juste drôle pour moi que Object.prototype.toString.call(NaN) équivaut à '[object Number]'. Mon cerveau de débutant me dit que NaN est "Pas un nombre" mais malheureusement ce n'est tout simplement pas si simple.

EDIT: J'imagine que j'aurais dû dire comment je me suis retrouvé à cet article. J'y suis allé avec l'idée que sûrement une chaîne qui ne contient pas de nombre ne serait pas traitée comme un nombre ... eh bien, j'ai fini par trouver ceci:

isNaN('a'); // true
isNaN(' '); // false

ainsi, même si ' ' est une chaîne non numérique, il est apparemment forcé à former un nombre (0).

console.log(Number(' ')); // 0.0

toutefois...

console.log( 0  ? true : false); // false
console.log(' ' ? true : false); // true

Après avoir lu plus, je le comprends un peu mieux, mais wow, quel trouble mental pour un débutant lol

0
Cecell