Signatur
Beschreibung
isNaN() ist eine Funktionseigenschaft des globalen Objekts (globalThis.isNaN). Sie wandelt das übergebene Argument zuerst mit denselben Regeln wie Number(value) in eine Zahl um und gibt true zurück, wenn das Ergebnis NaN ist. Andernfalls gibt sie false zurück.
Genau diese Typumwandlung ist oft verwirrend: Ein leerer String (""), ein String nur aus Leerzeichen, null, false oder [] werden zu 0 und ergeben daher false. Dagegen werden undefined, {} oder "abc" zu NaN und ergeben true. isNaN() beantwortet also weder zuverlässig die Frage „Ist das der Zahlenwert NaN?“ noch die Frage „Ist das keine Zahl?“.
Wenn du wirklich prüfen willst, ob ein Wert genau der Zahlenwert NaN ist, nimm Number.isNaN() (ES2015). Diese Methode wandelt nichts um. Alternativ funktioniert der Vergleich x !== x, denn NaN ist der einzige Wert, der nicht gleich sich selbst ist. Das globale isNaN() passt vor allem dann, wenn du bewusst wissen willst, ob sich ein Wert nach der Umwandlung als Zahl verwenden lässt. Ein Beispiel ist ein grober Plausibilitätstest für Formulareingaben, dann aber zusammen mit einer Prüfung auf leere Strings.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | any | Der zu prüfende Wert. Ist er keine Zahl, wird er vorher wie mit Number(value) umgewandelt. Ohne Argument wird undefined geprüft, und das Ergebnis ist true. |
Rückgabewert
true, wenn der Wert nach der Umwandlung in eine Zahl NaN ist, sonst false.Beispiele
Grundverhalten mit verschiedenen Typen
const werte = [NaN, 42, '42', 'abc', '', ' ', null, undefined, true, [], {}, '1e3'];
for (const w of werte) {
console.log(JSON.stringify(w) ?? String(w), '→', isNaN(w));
}
Unterschied zu Number.isNaN()
const pruefe = (v) => ({
wert: v,
global: isNaN(v),
strikt: Number.isNaN(v),
selbstvergleich: v !== v,
});
console.table(['abc', undefined, NaN, 0 / 0].map(pruefe));
Formulareingabe als Zahl validieren
const istGueltigeZahl = (eingabe) => {
const text = String(eingabe).trim();
// Leere Eingaben würden sonst als 0 durchgehen
if (text === '') return false;
return !isNaN(text) && Number.isFinite(Number(text));
};
console.log(istGueltigeZahl('19.99')); // true
console.log(istGueltigeZahl(' ')); // false
console.log(istGueltigeZahl('12abc')); // false
console.log(istGueltigeZahl('Infinity')); // false
Ergebnis einer Berechnung absichern
const durchschnitt = (zahlen) => zahlen.reduce((a, b) => a + b, 0) / zahlen.length;
const ergebnis = durchschnitt([]); // 0 / 0 → NaN
console.log(Number.isNaN(ergebnis) ? 'Keine Daten' : ergebnis);
// Wichtig · Fallstricke
- Überraschende Umwandlung:
isNaN(''),isNaN(' '),isNaN(null),isNaN(false)undisNaN([])ergebenfalse, weil diese Werte zu0werden.isNaN(undefined)undisNaN({})ergeben dagegentrue. - BigInt:
isNaN(10n)wirft einenTypeError, weil sich BigInt nicht mitNumber()-Semantik implizit umwandeln lässt.Number.isNaN(10n)gibt einfachfalsezurück. - Symbole:
isNaN(Symbol())wirft ebenfalls einenTypeError. - Seiteneffekte: Bei Objekten ruft die Umwandlung
valueOf()/toString()bzw.Symbol.toPrimitiveauf. Diese Methoden können Seiteneffekte haben. NaN === NaNistfalse. Ein direkter Vergleich funktioniert daher nie. VerwendeNumber.isNaN(),Object.is(x, NaN)oderx !== x.Infinityist nichtNaN. Für „endliche Zahl“ nimmNumber.isFinite().- Viele Linter (z. B. ESLint mit
no-restricted-globals) empfehlen, statt des globalenisNaN()die MethodeNumber.isNaN()zu verwenden. - Kompatibilität: Das globale
isNaN()wird überall unterstützt.Number.isNaN()gibt es seit ES2015 in allen modernen Browsern und in Node.js.