Ik heb het alleen geprobeerd in de JavaScript-console van Firefox, maar geen van de volgende uitspraken is waar:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
Antwoord 1, autoriteit 100%
Probeer deze code:
isNaN(parseFloat("geoff"))
Voor het controleren of eenwaarde NaN is, in plaats van alleen getallen, zie hier: Hoe test u NaN in Javascript?
Antwoord 2, autoriteit 25%
Ik kwam deze techniek net tegen in het boek Effectief JavaScriptdat mooi is eenvoudig:
Aangezien NaN de enige JavaScript-waarde is die als ongelijk aan zichzelf wordt beschouwd, kunt u altijd testen of een waarde NaN is door deze te controleren op gelijkheid met zichzelf:
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
Ik realiseerde me dit pas toen @allsyed een opmerking maakte, maar dit staat in de ECMA-specificatie: https://tc39.github.io/ecma262/#sec-isnan-nummer
Antwoord 3, autoriteit 9%
Gebruik deze code:
isNaN('geoff');
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
Antwoord 4, autoriteit 8%
Voor zover een waarde van het type Numbermoet worden getest of het een NaN
of niet, de globale functie isNaN
zal het werk doen
isNaN(any-Number);
Voor een generieke aanpak die voor alle typen in JS werkt, kunnen we een van de volgende gebruiken:
Voor ECMAScript-5-gebruikers:
#1
if(x !== x) {
console.info('x is NaN.');
}
else {
console.info('x is NOT a NaN.');
}
Voor mensen die ECMAScript-6 gebruiken:
#2
Number.isNaN(x);
En voor consistentie in ECMAScript 5 & 6 beide, kunnen we ook deze polyfill gebruiken voor 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;
}
controleer Dit antwoordvoor meer details.
Antwoord 5, Autoriteit 3%
Vanaf ES6 , Object.is(..)
is een nieuw hulpprogramma dat kan worden gebruikt om twee waarden te testen voor absolute gelijkheid:
var a = 3 / 'bar';
Object.is(a, NaN); // true
Antwoord 6, Autoriteit 3%
NAN is een speciale waarde die niet zo kan worden getest. Een interessant iets dat ik gewoon wilde delen, is dit
var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
alert('nanValue is NaN');
Hierdoor wordt er opzicht geretourneerd alleen voor NAN-waarden en is een veilige manier van testen. Moet zeker worden gewikkeld in een functie of tenminste, omdat het niet veel logisch is om te testen als dezelfde variabele niet gelijk is aan elkaar, hehe.
Antwoord 7, Autoriteit 2%
U moet de GLOBALE isNaN(value)
FUNCTION-oproep gebruiken, omdat:
- Het is ondersteund Cross-Browser
- Zie isnan voor documentatie
Voorbeelden:
isNaN('geoff'); // true
isNaN('3'); // false
Ik hoop dat dit u zal helpen.
Antwoord 8, Autoriteit 2%
Om het probleem op te lossen waarbij '1.2geoff'
wordt geparseerd, gebruik dan gewoon de Number()
parser in plaats daarvan.
dus in plaats van dit:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
Doe dit:
Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true
EDIT: ik heb hier zojuist een ander probleem opgemerkt… valse waarden (en waar als een echte boolean) doorgegeven aan Number()
return als 0
! In dat geval… werkt parseFloat in plaats daarvan elke keer. Dus val daarop terug:
function definitelyNaN (val) {
return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}
En dat dekt schijnbaar alles. Ik heb het vergeleken met 90% langzamer dan _.isNaN
van lodash, maar die dekt niet alle NaN’s:
http://jsperf.com/own-isnan-vs-underscore- lodash-isnan
Voor alle duidelijkheid, de mijne zorgt voor de menselijke letterlijke interpretatie van iets dat “Geen Nummer” is en die van Lodash zorgt voor de computer letterlijke interpretatie van het controleren of iets “NaN” is.
Antwoord 9
Hoewel het antwoord van @chiborg klopt, is er meer dat moet worden opgemerkt:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
Het punt is dat als je deze methode gebruikt voor het valideren van invoer, het resultaat nogal liberaal zal zijn.
Dus, ja, u kunt parseFloat(string)
(of in het geval van volledige nummers parseInt(string, radix)
‘gebruiken en vervolgens dat met isNaN()
, maar wees op de hoogte van de GOTCHA met nummers met elkaar verweven met extra niet-numerieke tekens.
Antwoord 10
NAN in JavaScript staat voor “Geen nummer”, hoewel het type eigenlijk nummer is.
typeof(NaN) // "number"
Controleer of een variabele van waarde NAN is, kunnen we niet simpelweg de functie-ISNAN () gebruiken, omdat ISNAN () het volgende probleem heeft, zie hieronder:
var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN
Wat hier echt gebeurt, is dat Myvar impliciet wordt gedwongen tot een nummer:
var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact
Het is eigenlijk logisch, omdat “A” eigenlijk geen nummer is. Maar wat we echt willen controleren, is of Myvar precies van waarde Nan is.
Zo is NAN () kan niet helpen. Wat moeten we dan doen?
In het licht dat NAN de enige JavaScript-waarde is die ongelijk op zichzelf wordt behandeld, zodat we kunnen controleren op zijn gelijkheid om te gebruiken! ==
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
Dus om te sluiten, als het waar is dat een variabele! == zelf, dan is deze variabele precies van waarde Nan:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
Antwoord 11
Als uw omgeving ECMAScript 2015 ondersteunt, wilt u misschien Number.isNaN
om er zeker van te zijn dat de waarde echt NaN
is.
Het probleem met isNaN
is, als u gebruik dat bij niet-numerieke gegevens er weinig verwarrende regels (volgens MDN) worden toegepast.Bijvoorbeeld,
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
Dus, in door ECMA Script 2015 ondersteunde omgevingen, wil je misschien
. gebruiken
Number.isNaN(parseFloat('geoff'))
Antwoord 12
Eenvoudige oplossing!
ECHT supereenvoudig! Hier! Gebruik deze methode!
function isReallyNaN(a) { return a !== a; };
Gebruik zo simpel als:
if (!isReallyNaN(value)) { return doingStuff; }
Bekijk de prestatietest hiermet deze functie versus geselecteerd antwoord< /kbd>
Ook: zie hieronder het eerste voorbeeld voor een paar alternatieve implementaties.
Voorbeeld:
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>
Antwoord 13
Ik gebruik underscore's isNaN
-functie omdat in JavaScript:
isNaN(undefined)
-> true
Wees je op zijn minst bewust van dat gedoe.
Antwoord 14
Ik wil gewoon een ander alternatief delen, het is niet per se beter dan anderen hier, maar ik denk dat het de moeite waard is om naar te kijken:
function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
De logica hierachter is dat elk nummer behalve 0
en NaN
naar true
wordt gegoten.
Ik heb een snelle test gedaan en deze presteert net zo goed als Number.isNaN
en controleert zichzelf op false. Alle drie presteren ze beter dan isNaN
De resultaten
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
Kan handig worden als je de kapotte functie isNaN
wilt vermijden.
Antwoord 15
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
Antwoord 16
Misschien ook dit:
function isNaNCustom(value){
return value.toString() === 'NaN' &&
typeof value !== 'string' &&
typeof value === 'number'
}
Antwoord 17
De regel is:
NaN != NaN
Het probleem van de functie van ISNAN () is dat het onverwacht resulteert in sommige gevallen:
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
Een betere manier om te controleren of de waarde echt is NAN is:
function is_nan(value) {
return value != value
}
is_nan(parseFloat("geoff"))
Antwoord 18
Het lijkt erop dat Isnan () niet wordt ondersteund in Node.js uit de doos.
Ik werkte met
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
Antwoord 19
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
Gelijkheid Operator (== en ===) kan niet worden gebruikt om een waarde tegen NAN te testen.
Kijk op Mozilla Documentatie The Global Nan Eigenschap is een waarde die niet-A-Numbe vertegenwoordigt
De beste manier is om 'isNaN()' te gebruiken, een ingebouwde functie om NaN te controleren. Alle browsers ondersteunen de manier..
Antwoord 20
Volgens IEEE 754 worden alle relaties met NaN als onwaar beoordeeld, behalve !=. Dus bijvoorbeeld (A >= B) = onwaar en (A <= B) = onwaar als A of B of beide NaN is/zijn.
Antwoord 21
Ik heb dit antwoord op een andere vraag geschreven op StackOverflowwaar een ander controleert wanneer NaN == null
maar toen werd het gemarkeerd als duplicaat, dus ik wil mijn baan niet verspillen.
Bekijk Mozilla Developer Netwerkover NaN
.
Kort antwoord
Gebruik gewoon distance || 0
als u zeker wilt weten dat uw waarde een juist getal is of isNaN()
om het te controleren.
Lang antwoord
De NaN (Not-a-Number) is een raar globaal object in javascript dat vaak wordt geretourneerd wanneer een wiskundige bewerking mislukte.
Je wilde controleren of NaN == null
wat resulteert in false
. Hovewer zelfs NaN == NaN
resultaten met false
.
Een eenvoudige manier om erachter te komen of variabele NaN
is, is een globale functie isNaN()
.
Een andere is x !== x
wat alleen waar is als x NaN is. (bedankt voor de herinnering aan @raphael-schweikert)
Maar waarom werkte het korte antwoord?
Laten we het uitzoeken.
Als je NaN == false
aanroept, is het resultaat false
, hetzelfde geldt voor NaN == true
.
Ergens in specificaties heeft JavaScript een record met altijd valse waarden, waaronder:
NaN
- Geen nummer""
- lege tekenreeksfalse
- een boolean falsenull
- null-objectundefined
- ongedefinieerde variabelen0
- numeriek 0, inclusief +0 en -0
Antwoord 22
Een andere oplossing wordt genoemd op MDN's parseFloat-pagina
Het biedt een filterfunctie om strikt te parseren
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
En dan kun je isNaN
gebruiken om te controleren of het NaN
is
Antwoord 23
Een andere manier gevonden, gewoon voor de lol.
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
Antwoord 24
De exacte manier om te controleren is:
//takes care of boolen, undefined and empty
isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
Antwoord 25
Ik heb deze kleine functie gemaakt die als een tierelier werkt.
In plaats van te controleren op NaN, wat contra-intuïtief lijkt, controleer je op een getal. Ik ben er vrij zeker van dat ik niet de eerste ben die het op deze manier doet, maar ik dacht ik deel het even.
function isNum(val){
var absVal = Math.abs(val);
var retval = false;
if((absVal-absVal) == 0){
retval = true
}
return retval;
}
Antwoord 26
Het antwoord van
marksyzm werkt goed, maar retourneert geen false voor Infinity
omdat Infinity technisch gezien geen getal is.
ik heb een functie isNumber
bedacht die controleert of het een getal is.
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"));
Antwoord 27
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);
Dit is niet elegant. maar na het proberen van isNAN() kwam ik tot deze oplossing die een ander alternatief is. In dit voorbeeld heb ik ook '.' omdat ik maskeer voor float. U kunt dit ook omkeren om ervoor te zorgen dat er geen cijfers worden gebruikt.
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
Dit is een evaluatie van één teken, maar u kunt ook een reeks doorlopen om te controleren op getallen.
Antwoord 28
Number('hello').toString() === 'NaN' // true
Number(undefined).toString() === 'NaN' // true
Number('12345').toString() === 'NaN' // false
// These all evaluate to 0 which is a number
Number('').toString() === 'NaN' // false // 0
Number('0').toString() === 'NaN' // false // 0
Number().toString() === 'NaN' // false // 0
// These all evaluate to 0 and 1 which is a number
Number(false).toString() === 'NaN' // false // 0
Number(true).toString() === 'NaN' // false // 1
Antwoord 29
Converteer het resultaat eenvoudig naar String en vergelijk met 'NaN'.
var val = Number("test");
if(String(val) === 'NaN') {
console.log("true");
}
Antwoord 30
Is (NaN >= 0)?...... "Ik weet het niet".
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
Voorwaarden worden alleen uitgevoerd als TRUE.
Niet op FALSE.
Niet op "Ik weet het niet".