Wie überprüfen Sie, ob eine Zahl in JavaScript NaN ist?

414

Ich habe es nur in der JavaScript-Konsole von Firefox versucht, aber keine der folgenden Anweisungen gibt true zurück:

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;
Paul D. Waite
quelle
5
lesenswert, wenn Ihr eigentliches Ziel darin besteht, Zahlen zu überprüfen: stackoverflow.com/questions/18082/…
Paul
1
@ Gothdo: Sicher, aber ich habe gefragt, wie man überprüft, ob eine Zahl NaN ist, im Gegensatz zu einem beliebigen Wert.
Paul D. Waite
2
@ PaulD.Waite Ja, aber viele Leute kommen hierher, wenn sie etwas googeln wie "wie man prüft, ob eine Variable in Javascript nan ist".
Michał Perłakowski
PaulD.Waite Ich stimme Ihnen zu, aber ich habe die gleichen Bedenken wie @Gothdo. Viele Leute landen auf dieser Frage mit der Absicht "Wie man prüft, ob ein Wert in JS NaN ist". Sie können den Kommentar von mjohnsonengr zu derselben Antwort überprüfen . Übrigens habe auch ich diese Frage für die Aufmerksamkeit der Moderatoren markiert .
Dopeddude

Antworten:

580

Versuchen Sie diesen Code:

isNaN(parseFloat("geoff"))

Hier erfahren Sie, ob ein Wert NaN ist und nicht nur Zahlen: Wie testen Sie NaN in Javascript?

Chiborg
quelle
8
Wird paseFloat benötigt?
Rahul
23
Wenn Sie möchten, dass eine leere Zeichenfolge als interpretiert wird NaN, dann ja. (Ich sage nicht, dass Sie immer würden.)
Paul D. Waite
1
Wenn ich Sie wäre, würde ich es einer Variablen zuweisen und die Bedingungsvariable! == Variable verwenden. Wie in den Spezifikationen tc39.github.io/ecma262/#sec-isnan-number
allsyed
3
isNaN(parseFloat("geoff")) // true isNaN(parseFloat("10geo")) // false Wie ist das nützlich?
Prashanth
Dies kann auch nützlich sein, um w3schools.com/jsref/jsref_isnan.asp
Srijan Chaudhary
146

Ich bin gerade auf diese Technik in dem Buch Effective JavaScript gestoßen , das ziemlich einfach ist:

Da NaN der einzige JavaScript-Wert ist, der als ungleich zu sich selbst behandelt wird, können Sie jederzeit testen, ob ein Wert NaN ist, indem Sie ihn auf Gleichheit mit sich selbst überprüfen:

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

Ich habe dies erst erkannt, als @allsyed einen Kommentar abgegeben hat, aber dies steht in der ECMA-Spezifikation: https://tc39.github.io/ecma262/#sec-isnan-number

Jazzy
quelle
27
Effektiv aber nicht intuitiv. Ich möchte diese Art von Code nicht beibehalten.
osa
35
Es ist nicht der Code, der nicht intuitiv ist, sondern NaN.
Jazzy
20
@ DanM Es ist kein Fehler, es ist das Standard-IEE754-Verhalten von NaN. So ist es in CPUs implementiert und es ist das erwartete Verhalten in jeder Programmiersprache der Welt, das Floats verwendet.
Tarmil
4
@ Asphalt ordnungsgemäß notiert! Das ist eigentlich sehr interessant; Ich habe immer gedacht, dass NaN-Ungleichheit eine Javascript-Sache ist.
Dan M
2
NaN === Nan; // false. Dies ist ein bekannter Fehler in Javascript. isNan ist eine neue Methode.
Atilkan
52

Verwenden Sie diesen Code:

isNaN('geoff');

Siehe isNaN()Dokumente zu MDN .

alert ( isNaN('abcd'));  // alerts true
alert ( isNaN('2.0'));  // alerts false
alert ( isNaN(2.0));  // alerts false
rahul
quelle
1
Vielleicht ist es nur mich, aber die Idee von NaN wird verwirrend , wenn var value = 0/0;und var value2= String("123 131");NaN - Werte und so etwas wie dies zu schaffen var value3 = "abcd";ist auch ein NaN Wert.
Nick Pineda
@ NickPineda Warum?
Sinjai
44

Soweit ein Wert vom Typ Number geprüft werden soll, ob es sich um einen Wert handelt NaNoder nicht, erledigt die globale Funktion isNaNdie Arbeit

isNaN(any-Number);

Für einen generischen Ansatz, der für alle Typen in JS funktioniert, können wir eine der folgenden Methoden verwenden:

Für ECMAScript-5-Benutzer:

#1
if(x !== x) {
    console.info('x is NaN.');
}
else {
    console.info('x is NOT a NaN.');
}

Für Benutzer von ECMAScript-6:

#2
Number.isNaN(x);

Aus Konsistenzgründen in ECMAScript 5 und 6 können wir diese Polyfüllung auch für Number.isNan verwenden

#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;
}

Bitte überprüfen Sie diese Antwort für weitere Details.

Dopeddude
quelle
6
Vielen Dank, dass Sie nicht nur "isNan ()" verwenden, sondern eine vollständig detaillierte Antwort geben. Dies ist genau das, wonach ich gesucht habe, als ich diese Frage bei Google gefunden habe.
Mjohnsonengr
1
".... hat in den oben genannten Fällen falsche Ergebnisse geliefert" Ich würde nicht falsch sagen, nur anders, weil der Globale isNaNdas Argument zuerst in einen Zahlenwert konvertiert.
Felix Kling
1
@FelixKling Bitte überprüfen Sie die aktualisierte Antwort. Vielen Dank.
Dopeddude
1
isNaN ("lorem ipsum"); // wahr mit ES5 hat mich umgehauen
Nick Pineda
2
@NickPineda Das Gefühl ist so gegenseitig, aber schließlich könnte MDN es so erklären: "Wenn das Argument für die isNaN-Funktion nicht vom Typ Number ist, wird der Wert zuerst zu einer Zahl gezwungen. Der resultierende Wert wird dann getestet, um festzustellen, ob dies der Fall ist." NaN. "
Dopeddude
16

NaN ist ein spezieller Wert, der so nicht getestet werden kann. Eine interessante Sache, die ich nur teilen wollte, ist diese

var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
    alert('nanValue is NaN');

Dies gibt nur für NaN-Werte true zurück und ist eine sichere Methode zum Testen. Sollte definitiv in eine Funktion eingeschlossen oder zumindest kommentiert werden, da es offensichtlich nicht viel Sinn macht zu testen, ob dieselbe Variable nicht gleich ist, hehe.

Jonathan Azulay
quelle
1
Das ist kein absolut zuverlässiger Weg. Gemäß den Spezifikationen. Variable! == Variable ist der zuverlässigste Weg, um nach NaN zu
suchen
1
Siehe meine Antwort oben auf diesem ^
Jazzy
14

Sie sollten den globalen isNaN(value)Funktionsaufruf verwenden, weil:

  • Es wird browserübergreifend unterstützt
  • Dokumentation finden Sie unter isNaN

Beispiele:

 isNaN('geoff'); // true
 isNaN('3'); // false

Ich hoffe, dies wird dir helfen.

Jerome WAGNER
quelle
1
Ja, isNaN('') //falseaber parseInt('') //NaN. Gleiches gilt für null.
Stiller Pinguin
13

Ab ES6 , Object.is(..)ist ein neues Dienstprogramm , das verwendet werden kann , zwei Werte für absolute Gleichheit zu testen:

var a = 3 / 'bar';
Object.is(a, NaN); // true
zangw
quelle
9

'1.2geoff'Verwenden Sie Number()stattdessen einfach den Parser, um das Problem zu beheben, bei dem eine Analyse durchgeführt wird .

Also eher als das:

parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true

Mach das:

Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true

EDIT: Ich habe gerade ein anderes Problem bemerkt ... falsche Werte (und wahr als echter Boolescher Wert) wurden Number()als zurückgegeben zurückgegeben 0! In diesem Fall ... funktioniert parseFloat stattdessen jedes Mal. Also greifen Sie darauf zurück:

function definitelyNaN (val) {
    return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}

Und das deckt scheinbar alles ab. Ich habe es mit 90% langsamer als das von lodash bewertet, _.isNaNaber dann deckt man nicht alle NaNs ab:

http://jsperf.com/own-isnan-vs-underscore-lodash-isnan

Um ganz klar zu sein, meine kümmert sich um die menschliche wörtliche Interpretation von etwas, das "keine Zahl" ist, und lodashs kümmert sich um die Computer-wörtliche Interpretation der Überprüfung, ob etwas "NaN" ist.

marksyzm
quelle
7

Während @chiborgs Antwort korrekt ist, sollte noch mehr beachtet werden:

parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true

Wenn Sie diese Methode zur Validierung der Eingabe verwenden, ist das Ergebnis eher liberal.

Also, ja, Sie können verwenden parseFloat(string)(oder im Fall von vollständigen Zahlen parseInt(string, radix)) und diese anschließend mit umschließen isNaN(), aber beachten Sie die Gotcha mit Zahlen, die mit zusätzlichen nicht numerischen Zeichen verflochten sind.

Ryan Griffith
quelle
1
Interessant. Gibt es eine Möglichkeit, dem entgegenzuwirken und festzustellen, dass "1.2geoff" keine wirklich gültige Zahlenfolge ist?
Gabe Halsmer
2
Beachten Sie, dass dies nur geschieht, wenn die Zeichenfolge mit einer Zahl beginnt . parseFloat('test1.2')wird zurückkehren NaN.
Eduard Luca
6

Einfache Lösung!

Wirklich super einfach! Hier! Haben Sie diese Methode!

function isReallyNaN(a) { return a !== a; };

Verwenden Sie so einfach wie:

if (!isReallyNaN(value)) { return doingStuff; }

Siehe Leistungstesthere mit dieser Funktion vs.selected answer

Außerdem: Im folgenden ersten Beispiel finden Sie einige alternative Implementierungen.


Beispiel:

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>

Es gibt einige alternative Pfade, die Sie für die Implementierung verwenden, wenn Sie keine Methode mit alternativem Namen verwenden möchten und sicherstellen möchten, dass sie globaler verfügbar ist. Warnung Diese Lösungen umfassen das Ändern nativer Objekte und sind möglicherweise nicht die beste Lösung. Seien Sie immer vorsichtig und beachten Sie, dass andere Bibliotheken, die Sie möglicherweise verwenden, von nativem Code oder ähnlichen Änderungen abhängen können.

Alternative Implementierung 1: Native ersetzen isNaN Methode.

//  Extremely simple. Just simply write the method.
window.isNaN = function(a) { return a !==a; }

Alternative Implementierung 2: An Zahlenobjekt anhängen
* Vorgeschlagen, da es sich auch um eine Polyfüllung für ECMA 5 bis 6 handelt

Number['isNaN'] || (Number.isNaN = function(a) { return a !== a });
//  Use as simple as
Number.isNaN(NaN)

Alternative Lösung , wenn leer

Eine einfache Fenstermethode Ich habe diesen Test geschrieben, wenn das Objekt leer ist . Es ist insofern etwas anders, als es nicht gibt, ob der Gegenstand "genau" NaN ist , aber ich dachte, ich würde ihn hochwerfen, da er auch nützlich sein kann, wenn nach leeren Gegenständen gesucht wird.

/** 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);
})();

Beispiel:


Extrem tief prüfen, ob es leer ist

Letzteres geht ein bisschen tief und prüft sogar, ob ein Objekt voller leerer Objekte ist. Ich bin sicher, es gibt Raum für Verbesserungen und mögliche Gruben, aber bisher scheint es fast alles zu fangen.

SpYk3HH
quelle
1
@ PaulD.Waite vielleicht ist es diese App, aber ich sehe keine akzeptierte Antwort. Tatsächlich sehe ich nur ungefähr 5 Antworten, aber ich sehe, dass es 15 gibt
SpYk3HH
1
Welche App benutzt du?
Paul D. Waite
2
@ PaulD.Waite Die SE für Android. auf Galaxie s3
SpYk3HH
1
Aha. Ich habe nicht die App, um mich selbst anzusehen, aber hier ist ein Link zur akzeptierten Antwort: stackoverflow.com/a/2652335/20578
Paul D. Waite
@ PaulD.Waite Ah, ich verstehe. Ich nehme an, in direkter Antwort auf nur die Frage an und für sich kann diese Antwort ausreichen. Ich habe meine Antwort auf eine andere Frage in Bezug auf "JS Weg, um zu überprüfen, ob 'wirklich' NaN ist" gepostet, da dies isNaNNICHT zuverlässig ist. Ich wurde dort kommentiert und sagte, diese Frage würde besser zu meiner Antwort passen, also verschob ich sie hierher. Stellen Sie einfach etwas Hilfreiches / Nützliches in Bezug auf dieses Problem bereit, das bei einer Google-Suche nach dem vorliegenden Problem angezeigt wird is it NaN?. Nebenbei bemerkt, meine Antwort wäre öfter genauer als die ausgewählte Antwort.
SpYk3HH
5

Ich möchte nur eine andere Alternative teilen, sie ist nicht unbedingt besser als andere hier, aber ich denke, es lohnt sich, sie sich anzusehen:

function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }

Die Logik dahinter ist, dass jede Zahl außer 0und NaNgegossen wird true.

Ich habe einen Schnelltest durchgeführt, und er funktioniert so gut wie Number.isNaNund prüft sich selbst auf falsch. Alle drei schneiden besser ab alsisNan

Die Ergebnisse

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

Kann nützlich sein, wenn Sie die isNaNFunktionsstörung vermeiden möchten .

Tiborg
quelle
5

Wenn Ihre Umgebung ECMAScript 2015 unterstützt , möchten Sie möglicherweise verwenden Number.isNaN, um sicherzustellen, dass der Wert wirklich ist NaN.

Das Problem mit isNaNist, wenn Sie das mit nicht numerischen Daten verwenden, werden nur wenige verwirrende Regeln (gemäß MDN) angewendet. Zum Beispiel,

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

In von ECMA Script 2015 unterstützten Umgebungen möchten Sie möglicherweise verwenden

Number.isNaN(parseFloat('geoff'))
thefourtheye
quelle
7
Meine Umgebung unterstützt nur ECMAScript XP Home Edition :(
Paul D. Waite
1
@ PaulD.Waite (Ich hoffe, Sie meinten IE 6: D) Kein Problem :-) Denken Sie daran, das isNaNkönnte Sie in Schwierigkeiten bringen und denken Sie daran, Number.isNaNin ECMAScript 2015-Umgebungen zu verwenden :-)
thefourtheye
5

NaN in JavaScript steht für "Not A Number", obwohl der Typ tatsächlich "number" ist.

typeof(NaN) // "number"

Um zu überprüfen, ob eine Variable den Wert NaN hat, können wir die Funktion isNaN () nicht einfach verwenden, da isNaN () das folgende Problem aufweist (siehe unten):

var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN

Was hier wirklich passiert, ist, dass myVar implizit zu einer Zahl gezwungen wird:

var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact

Es macht tatsächlich Sinn, weil "A" eigentlich keine Zahl ist. Was wir aber wirklich überprüfen möchten, ist, ob myVar genau den Wert NaN hat.

IsNaN () kann also nicht helfen. Was sollen wir dann stattdessen tun?

In Anbetracht dessen, dass NaN der einzige JavaScript-Wert ist, der ungleich sich selbst behandelt wird, können wir mit! == überprüfen, ob er sich selbst gleich ist

var myVar; // undefined
myVar !== myVar // false

var myVar = "A";
myVar !== myVar // false

var myVar = NaN
myVar !== myVar // true

So zu schließen , wenn es wahr ist , dass eine Variable == selbst, dann ist diese Variable genau der Wert NaN:

function isOfValueNaN(v) {
    return v !== v;
}

var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
Yuci
quelle
4

Ich benutze dieisNaN Funktion des Unterstrichs, weil in JavaScript:

isNaN(undefined) 
-> true

Sei dir zumindest dieser Gotcha bewusst.

d2vid
quelle
10
Ich bin verwirrt. Warum ist es falsch, wenn NaN bei Übergabe true zurückgibt undefined? Es ist wahr, dass undefinedes keine Zahl ist, nicht wahr ?
Xaxis
3
@Xaxis NaN sollte nicht als undefiniert angesehen werden, da es sich um spezielle Werte mit spezifischen und unterschiedlichen Bedeutungen handelt. Bedenken Sie Folgendes: Ich habe einen Wert, aber ich sage nicht, was es ist, vielleicht ist es eine Zahl und vielleicht ist es aus Ihrer Sicht nicht definiert.
Corin
1
@Corin undefinedkann etwas anderes sein als NaN, aber es ist immer noch keine Zahl, also isNaN(undefined)sollte (und ist)true
neuhaus
4

Vielleicht auch das:

function isNaNCustom(value){
    return value.toString() === 'NaN' && 
           typeof value !== 'string' && 
           typeof value === 'number'
}
Pierfrancesco
quelle
3

Es scheint, dass isNaN () in Node.js nicht sofort unterstützt wird.
Ich habe mit gearbeitet

var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
Stephan Ahlf
quelle
Sicher, aber ich habe nicht nach Node.js gefragt.
Paul D. Waite
3

function isNotANumber(n) {
  if (typeof n !== 'number') {
    return true;
  } 
  return n !== n;
}

Vivek Munde
quelle
Schätzen Sie die Hilfe!
Jimit Rupani
2
NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

Der Gleichheitsoperator (== und ===) kann nicht zum Testen eines Werts gegen NaN verwendet werden.

Siehe Mozilla-Dokumentation Die globale NaN-Eigenschaft ist ein Wert, der Not-A-Numbe darstellt

Der beste Weg ist die Verwendung von 'isNaN ()', einer eingebauten Funktion zur Überprüfung von NaN. Alle Browser unterstützen den Weg ..

MURATSPLAT
quelle
2

Die Regel lautet:

NaN != NaN

Das Problem der Funktion isNaN () besteht darin, dass in einigen Fällen ein unerwartetes Ergebnis zurückgegeben werden kann:

isNaN('Hello')      //true
isNaN('2005/12/12') //true
isNaN(undefined)    //true
isNaN('NaN')        //true
isNaN(NaN)          //true
isNaN(0 / 0)        //true

Ein besserer Weg, um zu überprüfen, ob der Wert wirklich NaN ist, ist:

function is_nan(value) {
    return value != value
}

is_nan(parseFloat("geoff"))
Bob Slave
quelle
1

Gemäß IEEE 754 werden alle Beziehungen, an denen NaN beteiligt ist, mit Ausnahme von! = Als falsch bewertet. So ist beispielsweise (A> = B) = falsch und (A <= B) = falsch, wenn A oder B oder beide NaN sind / sind.

Ronald Davis
quelle
1

Ich habe diese Antwort auf eine andere Frage in StackOverflow geschrieben, bei der eine andere prüft, wann, NaN == nullaber dann wurde sie als doppelt markiert, damit ich meinen Job nicht verschwenden möchte.

Schauen Sie sich Mozilla Developer Network an NaN.


Kurze Antwort

Verwenden distance || 0Sie diese Option nur, wenn Sie sicherstellen möchten, dass Ihr Wert eine richtige Zahl ist, oder isNaN()überprüfen Sie sie.

Lange Antwort

Das NaN (Not-a-Number) ist ein seltsames globales Objekt in Javascript, das häufig zurückgegeben wird, wenn eine mathematische Operation fehlschlägt.

Sie wollten überprüfen, ob NaN == nullwelche Ergebnisse vorliegen false. Hovewer NaN == NaNergibt sogar mit false.

Ein einfacher Weg, um herauszufinden, ob eine Variable NaNeine globale Funktion ist isNaN().

Ein anderer ist x !== x die nur wahr ist, wenn x NaN ist. (danke für die Erinnerung an @ raphael-schweikert)

Aber warum hat die kurze Antwort funktioniert?

Lass es uns herausfinden.

Wenn Sie NaN == falsedas Ergebnis aufrufen, ist das falsegleiche mit NaN == true.

Irgendwo in den Spezifikationen hat JavaScript einen Datensatz mit immer falschen Werten, der Folgendes umfasst:

  • NaN - Keine Nummer
  • "" - leerer String
  • false - ein boolescher Fehler
  • null - Nullobjekt
  • undefined - undefinierte Variablen
  • 0 - numerische 0, einschließlich +0 und -0
Geräumig
quelle
1
"Nur eine einfache Möglichkeit herauszufinden, ob die Variable NaN ist, ist eine globale Funktion isNaN ()" - nicht wahr; Es gibt noch einen anderen einfachen Weg: var xIsNaN = x !== x;Dies ergibt nur dann true, wenn x ist NaN.
Raphael Schweikert
1

Eine andere Lösung wird auf der parseFloat-Seite von MDN erwähnt

Es bietet eine Filterfunktion für striktes Parsen

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

Und dann können Sie isNaNüberprüfen, ob dies der Fall istNaN

Zzy
quelle
1

Der genaue Weg zu überprüfen ist:

//takes care of boolen, undefined and empty

isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
Nishanth Matha
quelle
1

Ich habe diese kleine Funktion erstellt, die wie ein Zauber wirkt. Anstatt nach NaN zu suchen, was nicht intuitiv zu sein scheint, suchen Sie nach einer Nummer. Ich bin mir ziemlich sicher, dass ich nicht der erste bin, der das so macht, aber ich dachte, ich würde es teilen.

function isNum(val){
    var absVal = Math.abs(val);
    var retval = false;
    if((absVal-absVal) == 0){
        retval = true
    }

    return retval;
}
Billy Hallman
quelle
1

Einen anderen Weg gefunden, nur zum Spaß.

function IsActuallyNaN(obj) {
  return [obj].includes(NaN);  
}
Madhukar Kedlaya
quelle
1

Die Antwort von marksyzm funktioniert gut, gibt aber nicht false zurück, Infinityda Infinity technisch gesehen keine Zahl ist.

Ich isNumberhabe mir eine Funktion ausgedacht, die prüft, ob es sich um eine Zahl handelt.

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"));

UPDATE: Ich habe festgestellt, dass dieser Code für einige Parameter fehlschlägt, also habe ich ihn verbessert.

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));

adddff
quelle
Ihre Prämisse, dass die Unendlichkeit technisch gesehen keine Zahl ist, ist technisch fehlerhaft: math.stackexchange.com/questions/36289/is-infinity-a-number . Aus meiner Lektüre der Antworten geht hervor, dass Unendlichkeit eine Zahl ist, die vom Kontext abhängt.
Jon P
Ich werde dies auf eine andere Frage verschieben
adddff
1
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);

Das ist nicht elegant. aber nachdem ich isNAN () ausprobiert hatte, kam ich zu dieser Lösung, die eine andere Alternative darstellt. In diesem Beispiel habe ich auch '.' weil ich für float maskiere. Sie können dies auch umkehren, um sicherzustellen, dass keine Zahlen verwendet werden.

("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)

Dies ist eine Einzelzeichenauswertung, aber Sie können auch eine Zeichenfolge durchlaufen, um nach Zahlen zu suchen.

Peter S. McIntyre
quelle
1

Sie können NaN mit der Javascript-Funktion isNaN überprüfen. Übergeben Sie einfach die Zahl oder den Wert an die Funktion isNaN

isNaN(123) //false
isNaN(-1.23) //false
isNaN(5-2) //false
isNaN(0) //false
isNaN('123') //false
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN('') //false
isNaN(true) //false
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
Sourav Singh
quelle
0

Konvertieren Sie einfach das Ergebnis in String und vergleichen Sie es mit 'NaN'.

var val = Number("test");
if(String(val) === 'NaN') {
   console.log("true");
}
Manikandan Arun
quelle
0

Ist (NaN> = 0) ? ...... " Ich weiß nicht ".

function IsNotNumber( i ){
    if( i >= 0 ){ return false; }
    if( i <= 0 ){ return false; }
    return true;
}

Bedingungen werden nur ausgeführt, wenn TRUE .

Nicht auf FALSE .

Nicht auf " Ich weiß nicht ".

JMI MADISON
quelle
Nicht sehr nützlich, wenn Sie explizit nach NaN-Werten suchen, anstatt nach dem Gegenteil zu suchen
liviu blidar