2011-08-08 4 views
38
parseFloat("NaN") 

renvoie "NaN", maisEst-ce que NaN est égal à NaN?

parseFloat("NaN") == "NaN" 

fausses déclarations. Maintenant, c'est probablement une bonne chose que ça renvoie faux, mais je ne comprends pas comment c'est ainsi. Est-ce que les créateurs de JavaScript en ont fait un cas particulier? Parce que sinon, je ne peux pas comprendre comment cela renvoie faux.

+14

NaN est égal à lui-même jamais, par définition. Cela fonctionne de cette façon dans n'importe quelle langue. – Keith

+0

Note [ma réponse ci-dessous] (http://stackoverflow.com/a/12628417/1195056) comme une méthode précise pour vérifier cela a été ajouté avec ECMAScript 6. – krillgar

+0

La meilleure partie de l'événement est que 'parseFloat (" A ") == parseFloat ("A") 'return' false' –

Répondre

31

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

+17

NaN n'est pas un objet; c'est une valeur primitive spéciale. (Qui se trouve être la valeur d'une propriété en lecture seule _of_ l'objet global). –

+0

@Henning Bonne prise, correction de ma réponse – Phil

30

Il est un cas particulier, NaN est la seule chose en Javascript pas égal à lui-même.

Bien que les autres réponses sur les chaînes par rapport à l'objet NaN ont raison aussi.

+1

Pourquoi alors "NaN" == "NaN" est-il vrai? Cela n'aurait probablement pas de sens de retourner false, mais ... – joseph

+26

@joseph "NaN" == "NaN" compare deux chaînes (égales). – dlev

8
  • Lorsque Number (retourné par parseFloat) se compare à stringstring converti en Number
  • NaN est pas égal à tout autre objet (y compris NaN)

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

28

Update 2

Nouveau sur 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) va maintenant retourner vrai. Si vous êtes able to utilize ECMAScript 6, alors ce serait la solution la plus lisible et cohérente pour vous.

originale

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

isNaN(parseInt(variable)) 

Si ce que vous vérifiez est un NAN, cette fonction retourne vrai. Cette méthode est intégrée dans la spécification JavaScript.

En utilisant jQuery

jQuery construit dans leur propre fonction isNaN à l'origine pour aider à contrer certaines différences entre les navigateurs, et ajouter quelques contrôles supplémentaires de sorte que leur version peut être utilisée à la place de celui VanillaJS.

Mise à jour pour jQuery

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

Documentation of the switch

Si vous jetez un oeil à this Stack Overflow question, vous trouverez beaucoup de fois où isNaN() rendements ce qui serait intuitivement considéré comme une réponse « incorrecte », mais est correct par la spécification.

Une des grandes raisons pour éviter la vanille isNaN() est que null renverra false, vous faisant croire que c'est un nombre. Cependant, la fonction jQuery couvre une gamme beaucoup plus large de résultats intuitifs.

De leur documentation:

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

+12

Cela n'a rien à voir avec jQuery. Quelle? – user1596138

+0

Ce n'est pas parce que jQuery a changé la fonction qu'il utilise que vous devez le faire. –

9

NaN est l'un des rares exemples d'un objet qui n'est pas égal à lui-même. En fait, cette propriété très est utilisé pour mettre en œuvre la méthode bool IsNaN(number) commune:

function isNaN(x) 
{ 
    return x != x; 
} 
+4

c'est drôle * javascript * –

+3

Changé l'exemple de C# en JavaScript. –

+1

"quelques exemples"? est-ce qu'il y en a un autre? Si c'est le cas, cette implémentation échoue sur ces autres exemples. – djechlin

4

isNaN œuvres 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 NaN précisément, ou éviter la coercition de type;
vous pouvez utiliser à la place Number.isNaN

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

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 la même valeur. C'est la raison parce que console.log (Object.is (NaN, NaN)) -> TRUE

0

Je travaille avec Google Apps Script et donc je suis coincé avec ECMA 5. Semblable à la réponse de Electric Coffee, voici ce que j'ai pu comprendre qui semble donner une réponse que si une valeur ou non est en fait NaN, pas si une valeur est NaN mais si elle est en fait NaN lui-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) est égal à '[object Number]'. Mon cerveau de débutant me dit que NaN est "pas un nombre" mais malheureusement ce n'est pas si simple.

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

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

donc même si ' ' est une chaîne non numérique, il est apparemment cajolé dans un nombre (0).

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

cependant ...

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

Après avoir lu plus je comprends un peu mieux mais wow quel crapstorm mentale pour un débutant lol