Comment vérifier qu'un nombre est NaN en JavaScript?
-
27-09-2019 - |
Question
Je ne l'ai essayé dans la console JavaScript de Firefox, mais aucun des énoncés suivants renvoient true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
La solution
Essayez ce code:
isNaN(parseFloat("geoff"))
Pour vérifier si une valeur est NaN, au lieu de chiffres seulement, voir ici: Comment tester NaN en Javascript?
Autres conseils
Je viens de découvrir cette technique dans le livre JavaScript efficace qui est assez simple:
Depuis NaN est la seule valeur JavaScript qui est traité comme inégal à lui-même, vous pouvez toujours tester si une valeur est NaN en cochant la case pour l'égalité se:
var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false
n'a pas réalisé jusqu'à ce que @allsyed a commenté, mais cela est dans la spécification ECMA: https://tc39.github.io/ecma262/#sec-isnan-number
Utilisez ce code:
isNaN('geoff');
Voir isNaN()
docs sur MDN.
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
En ce qui concerne une valeur de type Nombre est à tester si elle est un NaN
ou non, la isNaN
fonction globale fera le travail
isNaN(any-Number);
Pour une approche générique qui fonctionne pour tous les types de JS, nous pouvons utiliser les éléments suivants:
Pour ECMAScript 5 utilisateurs:
#1
if(x !== x) {
console.info('x is NaN.');
}
else {
console.info('x is NOT a NaN.');
}
Pour les personnes utilisant ECMAScript-6:
#2
Number.isNaN(x);
Pour des raisons de cohérence entre ECMAScript 5 et 6 fois, nous pouvons également utiliser cette polyfill pour Number.isNan
#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
cette réponse pour plus de détails.
NaN est une valeur spéciale qui ne peut pas être testé comme ça. Une chose intéressante que je voulais juste part est ce
var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
alert('nanValue is NaN');
Retourne vrai seulement pour les valeurs NaN et est un moyen sûr de tests. Devrait certainement être enveloppé dans une fonction ou du moins commenté, car il ne marche pas beaucoup de sens évidemment pour tester si la même variable ne correspond pas à l'autre, hehe.
Vous devez utiliser l'appel de la fonction globale de isNaN(value)
, parce que:
- Il est multi-navigateur pris en charge
- Voir isNaN pour la documentation
Exemples:
isNaN('geoff'); // true
isNaN('3'); // false
J'espère que cela vous aidera.
ES6 , Object.is(..)
est un nouvel utilitaire qui peut être utilisé pour tester deux valeurs pour l'égalité absolue:
var a = 3 / 'bar';
Object.is(a, NaN); // true
Pour résoudre le problème où '1.2geoff'
devient analysée, il suffit d'utiliser à la place l'analyseur Number()
.
Ainsi, plutôt que ceci:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
Pour ce faire:
Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true
EDIT: Je viens de remarquer une autre question de ce bien que ... les fausses valeurs (et vrai comme un véritable booléen) passé en retour Number()
comme 0
! Dans ce cas ... parseFloat fonctionne à chaque fois à la place. Donc, revenir à ce que:
function definitelyNaN (val) {
return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}
Et qui couvre tout en apparence. Je l'ai benchmarkée à 90% plus lent que _.isNaN
de lodash mais que l'on ne couvre pas toutes NAN:
http://jsperf.com/own-isnan-vs-underscore- lodash-isnan
Pour être clair, le mien prend soin de l'interprétation littérale de l'homme quelque chose qui est « pas un nombre » et de lodash prend soin de l'ordinateur interprétation littérale de vérifier si quelque chose est « NaN ».
Alors que la réponse de » @chiborg est correcte, il est plus à ce qu'il convient de relever:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
être point, si vous utilisez cette méthode pour la validation de l'entrée, le résultat sera plutôt libéral.
Alors, oui, vous pouvez utiliser parseFloat(string)
(ou dans le cas de plein numéros parseInt(string, radix)
», puis par la suite WRAP avec isNaN()
, mais être conscient du Gotcha avec des chiffres entrelacés avec des caractères non numériques supplémentaires.
Solution simple!
simple, vraiment super! Ici! Cette méthode!
function isReallyNaN(a) { return a !== a; };
Utilisation aussi simple que:
if (!isReallyNaN(value)) { return doingStuff; }
Voir test de performance ici en utilisant ce func vs < a href = "https://stackoverflow.com/questions/2652319/how-do-you-check-that-a-number-is-nan-in-javascript/#answer-2652335"> réponse sélectionnée
Aussi:. Voir ci-dessous le 1er exemple pour une mise en oeuvre d'alternatives couple
Exemple:
function isReallyNaN(a) { return a !== a; };
var example = {
'NaN': NaN,
'an empty Objet': {},
'a parse to NaN': parseFloat('$5.32'),
'a non-empty Objet': { a: 1, b: 2 },
'an empty Array': [],
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined
}
for (x in example) {
var answer = isReallyNaN(example[x]),
strAnswer = answer.toString();
$("table").append($("<tr />", { "class": strAnswer }).append($("<th />", {
html: x
}), $("<td />", {
html: strAnswer
})))
};
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: 2px 5px; }
.true { color: red; }
.false { color: green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>
Il y a quelques chemins alternatifs que vous prenez pour implementaion, si vous ne voulez pas utiliser une méthode nommée tour à tour, et aimeraient assurer qu'il est plus disponible au niveau mondial. Attention Ces solutions impliquent en train de modifier des objets natifs et peuvent ne pas être la meilleure solution. Soyez toujours vigilant et être conscient que d'autres bibliothèques que vous pourriez utiliser peut dépendre du code natif ou des modifications similaires.
Autre mise en œuvre 1: Remplacer la méthode native isNaN
.
// Extremely simple. Just simply write the method.
window.isNaN = function(a) { return a !==a; }
Mise en œuvre Alternate 2: append à Numéro de l'objet
* suggérée comme il est aussi un poly-remplissage pour ECMA de 5 à 6
Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });
// Use as simple as
Number.isNaN(NaN)
Autre solution test si vide
Une méthode simple de fenêtre je l'ai écrit ce test si l'objet est vide . Il est un peu différent en ce qu'il ne donne pas si l'article est « exactement » NaN , mais je pensais que je jetterais cela comme il peut aussi être utile lors de la recherche des articles vides.
/** isEmpty(varried)
* Simple method for testing if item is "empty"
**/
;(function() {
function isEmpty(a) { return (!a || 0 >= a) || ("object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a))); };
window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();
Exemple:
;(function() {
function isEmpty(a) { return !a || void 0 === a || a !== a || 0 >= a || "object" == typeof a && /\{\}|\[(null(,)*)*\]/.test(JSON.stringify(a)); };
window.hasOwnProperty("empty")||(window.empty=isEmpty);
})();
var example = {
'NaN': NaN,
'an empty Objet': {},
'a parse to NaN': parseFloat('$5.32'),
'a non-empty Objet': { a: 1, b: 2 },
'an empty Array': new Array(),
'an empty Array w/ 9 len': new Array(9),
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined
}
for (x in example) {
var answer = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
th, td { border: 1px solid; padding: 2px 5px; }
.true { color: red; }
.false { color: green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
Extrêmement profond Vérifiez si est vide
Ce dernier va un profond bits, même vérifier si un objet est plein d'objets en blanc. Je suis sûr qu'il a de la place pour les fosses d'amélioration et possibles, mais jusqu'à présent, il semble attraper presque tout.
function isEmpty(a) {
if (!a || 0 >= a) return !0;
if ("object" == typeof a) {
var b = JSON.stringify(a).replace(/"[^"]*":(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '').replace(/"[^"]*":\{\},?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
else if (a instanceof Array) {
b = b.replace(/(0|"0*"|false|null|\{\}|\[(null(,)?)*\]),?/g, '');
if ( /^$|\{\}|\[\]/.test(b) ) return !0;
}
}
return false;
}
window.hasOwnProperty("empty")||(window.empty=isEmpty);
var example = {
'NaN': NaN,
'an empty Objet': {},
'a parse to NaN': parseFloat('$5.32'),
'a non-empty Objet': { a: 1, b: 2 },
'an empty Array': new Array(),
'an empty Array w/ 9 len': new Array(9),
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined,
'Object Full of Empty Items': { 1: '', 2: [], 3: {}, 4: false, 5:new Array(3), 6: NaN, 7: null, 8: void 0, 9: 0, 10: '0', 11: { 6: NaN, 7: null, 8: void 0 } },
'Array Full of Empty Items': ["",[],{},false,[null,null,null],null,null,null,0,"0",{"6":null,"7":null}]
}
for (x in example) {
var answer = empty(example[x]),
strAnswer = answer.toString();
$("#t1").append(
$("<tr />", { "class": strAnswer }).append(
$("<th />", { html: x }),
$("<td />", { html: strAnswer.toUpperCase() })
)
)
};
function isReallyNaN(a) { return a !== a; };
for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};
table { border-collapse: collapse; float: left; }
th, td { border: 1px solid; padding: 2px 5px; }
.true { color: red; }
.false { color: green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
<table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>
Si vos supports d'environnement EcmaScript 2015 , vous pouvez utiliser Number.isNaN
pour vous assurer que la valeur est vraiment NaN
.
Le problème avec isNaN
est, si vous utilisez que des données non numériques il y a peu de règles confuses (comme par MDN) sont appliqués. par exemple,
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
Ainsi, dans ECMAScript 2015 environnements pris en charge, vous voudrez peut-être utiliser
Number.isNaN(parseFloat('geoff'))
NaN en JavaScript signifie "Not A Number", bien que son type est en fait nombre.
typeof(NaN) // "number"
Pour vérifier si une variable est de la valeur NaN, nous ne pouvons pas simplement utiliser la fonction isNaN (), parce que isNaN () a la question suivante, voir ci-dessous:
var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN
Qu'est-ce qui se passe vraiment ici mavar est contraint implicitement à un certain nombre:
var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact
Il est en fait sens, parce que « A » est en fait pas un nombre. Mais ce que nous voulons vraiment vérifier est si myVar est exactement de la valeur NaN.
isNaN () ne peut pas aider. Alors que devons-nous faire à la place?
Dans la lumière qui NaN est la seule valeur JavaScript qui est traité inégal à lui-même, afin que nous puissions vérifier son égalité s'utilisant! ==
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
Pour conclure , s'il est vrai qu'une variable == lui-même, cette variable est exactement la valeur NaN:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
J'utilise underscore de fonction isNaN
car en JavaScript:
isNaN(undefined)
-> true
Au moins, être conscient de ce Gotcha.
Je veux juste partager une autre alternative, ce n'est pas nécessairement mieux que d'autres, mais je pense qu'il vaut la peine de regarder à:
function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
La logique derrière cela est que chaque numéro, sauf 0
et NaN
sont jetés à true
.
Je l'ai fait un test rapide, et il effectue aussi bon que Number.isNaN
et que la vérification contre lui-même pour faux. Tous les trois fonctionnent mieux que isNan
Les résultats
customIsNaN(NaN); // true
customIsNaN(0/0); // true
customIsNaN(+new Date('?')); // true
customIsNaN(0); // false
customIsNaN(false); // false
customIsNaN(null); // false
customIsNaN(undefined); // false
customIsNaN({}); // false
customIsNaN(''); // false
Peut être utile si vous voulez éviter la fonction isNaN
brisée.
Il semble que isNaN () ne sont pas pris en charge dans Node.js hors de la boîte.
Je CONTOURNÉS avec
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
Peut-être aussi ceci:
function isNaNCustom(value){
return value.toString() === 'NaN' &&
typeof value !== 'string' &&
typeof value === 'number'
}
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
opérateur d'égalité (== et ===) ne peut pas être utilisé pour tester une valeur par rapport NNA.
Regardez Mozilla Documentation NAN global la propriété est une valeur représentant non-a-Numbe
La meilleure façon est d'utiliser « isNaN () » qui est buit en fonction pour vérifier NaN. Tous les navigateurs prend en charge le chemin ..
La façon exacte à vérifier est:
//takes care of boolen, undefined and empty
isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
Selon IEEE 754, toutes les relations impliquant NaN évaluer comme faux sauf! =. Ainsi, par exemple, (A> B =) = false et (A <= B) = false si A ou B, ou les deux est / sont NaN.
J'ai écrit cette réponse à une autre question sur StackOverflow où un autre vérifie quand NaN == null
, mais il a été marqué comme doublon, donc je ne veux pas perdre mon travail.
Regardez Mozilla Developer réseau sur NaN
.
Réponse courte
Il suffit d'utiliser distance || 0
lorsque vous voulez être sûr que vous la valeur est un nombre approprié ou isNaN()
pour le vérifier.
Réponse longue
Le NaN (Not-a-Number) est un cinglé objet global en javascript fréquemment retourné quand une opération a échoué mathématique.
Vous voulez vérifier si NaN == null
qui résulte false
. Hovewer même avec des résultats NaN == NaN
false
.
Une façon simple de savoir si la variable est NaN
est une isNaN()
de fonction globale.
Une autre est x !== x
qui est vrai que lorsque x est NaN. (merci pour rappeler à @ raphael-Schweikert)
Mais pourquoi la réponse courte a travaillé?
Let trouver.
Lorsque vous appelez NaN == false
le résultat est false
, même avec NaN == true
.
Quelque part dans les spécifications JavaScript a un dossier avec des valeurs toujours fausses, qui comprend:
-
NaN
- Non-a-Number -
""
- chaîne vide -
false
- un faux booléen -
null
- objet null -
undefined
- variables non définies -
0
- 0 numérique, y compris +0 -0
Une autre solution est mentionnée dans la page parseFloat de MDN
Il fournit une fonction de filtre pour faire l'analyse syntaxique stricte
var filterFloat = function (value) {
if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
.test(value))
return Number(value);
return NaN;
}
console.log(filterFloat('421')); // 421
console.log(filterFloat('-421')); // -421
console.log(filterFloat('+421')); // 421
console.log(filterFloat('Infinity')); // Infinity
console.log(filterFloat('1.61803398875')); // 1.61803398875
console.log(filterFloat('421e+0')); // NaN
console.log(filterFloat('421hop')); // NaN
console.log(filterFloat('hop1.61803398875')); // NaN
Et vous pouvez utiliser isNaN
pour vérifier si elle est NaN
J'ai créé cette petite fonction qui fonctionne comme un charme. Au lieu de vérifier NaN qui semble être contre-intuitif, vous vérifiez un numéro. Je suis sûr que je ne suis pas le premier à le faire de cette façon, mais je pensais que je partagerais.
function isNum(val){
var absVal = Math.abs(val);
var retval = false;
if((absVal-absVal) == 0){
retval = true
}
return retval;
}
trouvé une autre façon, juste pour le plaisir.
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
La réponse de marksyzm fonctionne bien, mais il ne retourne pas faux pour Infinity
comme Infinity est techinicly pas un nombre.
je suis venu avec une fonction isNumber
qui va vérifier si elle est un nombre.
function isNumber(i) {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].indexOf(i) === -1;
}
console.log(isNumber(Infinity));
console.log(isNumber("asdf"));
console.log(isNumber(1.4));
console.log(isNumber(NaN));
console.log(isNumber(Number.MAX_VALUE));
console.log(isNumber("1.68"));
Mise à jour: i remarqué que ce code échoue pour certains paramètres, donc je l'ai fait mieux.
function isNumber(i) {//function for checking if parameter is number
if(!arguments.length) {
throw new SyntaxError("not enough arguments.");
} else if(arguments.length > 1) {
throw new SyntaxError("too many arguments.");
} else if([Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY].indexOf(i) !== -1) {
throw new RangeError("number cannot be \xB1infinity.");
} else if(typeof i === "object" && !(i instanceof RegExp) && !(i instanceof Number) && !(i === null)) {
throw new TypeError("parameter cannot be object/array.");
} else if(i instanceof RegExp) {
throw new TypeError("parameter cannot be RegExp.");
} else if(i == null || i === undefined) {
throw new ReferenceError("parameter is null or undefined.");
} else {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && (i === i);
}
}
console.log(isNumber(Infinity));
console.log(isNumber(this));
console.log(isNumber(/./ig));
console.log(isNumber(null));
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);
Ce n'est pas élégant. mais après avoir essayé isNAN () je suis arrivé à cette solution qui est une autre alternative. Dans cet exemple, je également permis. » parce que je suis un masque facial pour flotter. Vous pouvez également inverser ce pour vous assurer qu'aucun numéros sont utilisés.
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
Ceci est une évaluation de caractère unique, mais vous pouvez aussi la boucle par une chaîne pour vérifier les chiffres.
(NaN> = 0) ? ...... " Je ne sais pas ".
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
Conditions d'exécuter uniquement si TRUE .
Pas sur false .
Pas sur " Je ne sais pas ".
La règle est:
NaN != NaN
Le problème de la fonction isNaN () est qu'il peut retourner des résultats inattendus dans certains cas:
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
Une meilleure façon de vérifier si la valeur est vraiment NaN est:
function is_nan(value) {
return value != value
}
is_nan(parseFloat("geoff"))
convertir simplement le résultat à cordes et comparer avec NAN.
var val = Number("test");
if(String(val) === 'NaN') {
console.log("true");
}
Je vois plusieurs réponses à cela,
Mais je viens d'utiliser:
function isNaN(x){
return x == x && typeof x == 'number';
}