Signatur
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
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
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]));
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);
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
// Wichtig · Fallstricke
- Kein Vergleich mit
===oder==:x === NaNist immerfalse. Prüfen Sie stattdessen mitNumber.isNaN(x)oderObject.is(x, NaN). isNaN()vs.Number.isNaN(): Das globaleisNaN()wandelt sein Argument vorher in eine Zahl um. Deshalb ergibtisNaN('abc')true,Number.isNaN('abc')dagegenfalse.Number.isNaN()ist meist die bessere Wahl.- Schreibgeschützt: Eine Zuweisung wie
Number.NaN = 0wird im Sloppy-Modus stillschweigend ignoriert. Im Strict-Modus löst sie einenTypeErroraus. - Ansteckend: Jede arithmetische Operation mit
NaNergibt wiederNaN. 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()findetNaNnicht.includes()findet es, undSetundMapbehandelnNaNals gleich.- Kompatibilität: wird seit ECMAScript 1 von allen Browsern und von Node.js unterstützt.