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.
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
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()
.
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.
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.
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;
}
Number
(renvoyé par ParseFloat) est comparé à string
string
converti en Number
NaN
n'est égal à aucun autre objet (y compris NaN
)Vous obtenez NaN==NaN
. C'est faux par seconde règle.
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
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
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