Start · Sprachen · JavaScript · Referenz · Number.NaN

Number.NaN

Eigenschaft

Die statische Eigenschaft <code>Number.NaN</code> liefert den Sonderwert „Not-A-Number“. Er ist identisch mit dem globalen <code>NaN</code>.

seit JavaScript ES1 (Baseline: alle Browser) Kategorie: method-property

Signatur

Number.NaN

Beschreibung

Number.NaN ist eine statische, schreibgeschützte Dateneigenschaft des Number-Konstruktors. Sie enthält den IEEE-754-Sonderwert Not-A-Number. Der Wert ist gleich dem globalen NaN. Er entsteht zum Beispiel, wenn eine Rechenoperation kein gültiges numerisches Ergebnis hat: 0 / 0, Math.sqrt(-1) oder Number("abc").

Die Eigenschaft ist nicht beschreibbar, nicht aufzählbar und nicht konfigurierbar. Man ruft sie immer als Number.NaN auf und nie über eine Zahleninstanz. In der Praxis setzt man sie ein, um in numerischem Code ausdrücklich ein „ungültiges Ergebnis“ zurückzugeben. Sie macht den Zusammenhang mit dem Number-Typ sichtbar, etwa in Hilfsfunktionen, die immer eine Zahl liefern sollen.

Wichtig ist: NaN ist der einzige Wert in JavaScript, der nicht gleich sich selbst ist. Number.NaN === Number.NaN ergibt false. Zum Prüfen nimmt man deshalb Number.isNaN() oder Object.is(), nicht == oder ===. Trotz seines Namens ist der Typ von NaN "number".

Rückgabewert

Typ
number
Beschreibung
Der Sonderwert NaN. typeof Number.NaN ergibt "number".

Beispiele

Grundlegende Eigenschaften von Number.NaN

console.log(Number.NaN);                 // NaN
console.log(typeof Number.NaN);          // "number"
console.log(Number.NaN === NaN);         // false – NaN ist nie gleich sich selbst
console.log(Object.is(Number.NaN, NaN)); // true – gleicher Wert
console.log(Number.isNaN(Number.NaN));   // true
NaN number false true true

Ungültiges Ergebnis in einer Hilfsfunktion zurückgeben

const durchschnitt = (werte) => {
  if (!Array.isArray(werte) || werte.length === 0) {
    return Number.NaN; // ausdrücklich: kein sinnvoller Wert
  }
  return werte.reduce((summe, x) => summe + x, 0) / werte.length;
};

const ergebnis = durchschnitt([]);
console.log(Number.isNaN(ergebnis) ? 'Keine Daten' : ergebnis);
console.log(durchschnitt([2, 4, 6]));
Keine Daten 4

Benutzereingaben validieren

const eingaben = ['42', '3.14', 'abc', '', '  7  '];

const zahlen = eingaben.map((s) => {
  const n = s.trim() === '' ? Number.NaN : Number(s);
  return Number.isNaN(n) ? null : n;
});

console.log(zahlen);
[42, 3.14, null, null, 7]

NaN in Arrays finden: indexOf vs. includes

const messwerte = [1.2, Number.NaN, 3.4];

console.log(messwerte.indexOf(NaN));    // -1 (vergleicht mit ===)
console.log(messwerte.includes(NaN));   // true (SameValueZero)
console.log(messwerte.findIndex(Number.isNaN)); // 1
-1 true 1

// Wichtig · Fallstricke

  • Kein Vergleich mit === oder ==: x === NaN ist immer false. Prüfen Sie stattdessen mit Number.isNaN(x) oder Object.is(x, NaN).
  • isNaN() vs. Number.isNaN(): Das globale isNaN() wandelt sein Argument vorher in eine Zahl um. Deshalb ergibt isNaN('abc') true, Number.isNaN('abc') dagegen false. Number.isNaN() ist meist die bessere Wahl.
  • Schreibgeschützt: Eine Zuweisung wie Number.NaN = 0 wird im Sloppy-Modus stillschweigend ignoriert. Im Strict-Modus löst sie einen TypeError aus.
  • Ansteckend: Jede arithmetische Operation mit NaN ergibt wieder NaN. Ein einziger ungültiger Wert kann so eine ganze Summe oder einen Durchschnitt „vergiften“.
  • JSON: JSON.stringify(NaN) ergibt "null". Der Wert geht bei der Serialisierung also verloren.
  • indexOf: Array.prototype.indexOf() findet NaN nicht. includes() findet es, und Set und Map behandeln NaN als gleich.
  • Kompatibilität: wird seit ECMAScript 1 von allen Browsern und von Node.js unterstützt.