Start · Sprachen · JavaScript · Referenz · isNaN()

isNaN()

Funktion

Die globale Funktion <code>isNaN()</code> wandelt einen Wert bei Bedarf in eine Zahl um und prüft dann, ob das Ergebnis <code>NaN</code> ist.

seit JavaScript ES1 – Baseline: alle Browser und Node.js Kategorie: core

Signatur

isNaN(value)

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

Typ
boolean
Beschreibung
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));
}
null → true // NaN wird von JSON.stringify als null ausgegeben 42 → false "42" → false "abc" → true "" → false " " → false null → false undefined → true true → false [] → false {} → true "1e3" → false

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));
'abc' global: true strikt: false selbstvergleich: false undefined global: true strikt: false selbstvergleich: false NaN global: true strikt: true selbstvergleich: true NaN (0/0) global: true strikt: true selbstvergleich: true

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
true false false 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);
Keine Daten

// Wichtig · Fallstricke

  • Überraschende Umwandlung: isNaN(''), isNaN(' '), isNaN(null), isNaN(false) und isNaN([]) ergeben false, weil diese Werte zu 0 werden. isNaN(undefined) und isNaN({}) ergeben dagegen true.
  • BigInt: isNaN(10n) wirft einen TypeError, weil sich BigInt nicht mit Number()-Semantik implizit umwandeln lässt. Number.isNaN(10n) gibt einfach false zurück.
  • Symbole: isNaN(Symbol()) wirft ebenfalls einen TypeError.
  • Seiteneffekte: Bei Objekten ruft die Umwandlung valueOf()/toString() bzw. Symbol.toPrimitive auf. Diese Methoden können Seiteneffekte haben.
  • NaN === NaN ist false. Ein direkter Vergleich funktioniert daher nie. Verwende Number.isNaN(), Object.is(x, NaN) oder x !== x.
  • Infinity ist nicht NaN. Für „endliche Zahl“ nimm Number.isFinite().
  • Viele Linter (z. B. ESLint mit no-restricted-globals) empfehlen, statt des globalen isNaN() die Methode Number.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.