Signatur
Beschreibung
Mit new Number(value) entsteht ein Wrapper-Objekt um einen primitiven Zahlenwert. typeof liefert dafür "object" und nicht "number". Den enthaltenen primitiven Wert bekommt man mit valueOf(). In der Praxis braucht man solche Objekte fast nie, denn JavaScript verpackt primitive Zahlen automatisch und nur für kurze Zeit, sobald man eine Methode wie (42).toFixed(2) aufruft.
Viel häufiger nutzt man Number(value) ohne new. So aufgerufen, arbeitet Number als Umwandlungsfunktion und gibt eine primitive Zahl zurück. Die Umwandlung folgt festen Regeln: Strings werden nach dem Entfernen von Leerzeichen am Anfang und Ende als Zahl gelesen ("" ergibt 0). true/false werden zu 1/0, null wird zu 0, undefined zu NaN. Ein BigInt wird in eine Zahl umgewandelt, wobei Genauigkeit verloren gehen kann. Objekte werden zuerst über valueOf()/toString() in einen primitiven Wert umgewandelt.
Für das Einlesen von Nutzereingaben ist Number() strenger als parseInt()/parseFloat(). "12px" ergibt NaN statt 12. So erkennt man ungültige Eingaben zuverlässiger.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | any | 0 | Der Wert, der in eine Zahl umgewandelt werden soll. Fehlt er, ist das Ergebnis 0. Nicht umwandelbare Werte ergeben NaN. |
Rückgabewert
new: ein Number-Objekt (typeof ergibt "object"). Ohne new: eine primitive Zahl (typeof ergibt "number"), unter Umständen NaN.Beispiele
Wrapper-Objekt und primitive Zahl im Vergleich
const obj = new Number(42);
const prim = Number(42);
console.log(typeof obj); // Objekt
console.log(typeof prim); // primitiv
console.log(obj == prim); // lockerer Vergleich: true
console.log(obj === prim); // strikter Vergleich: false
console.log(obj.valueOf() === prim);
Formulareingaben streng in Zahlen umwandeln
const inputs = ['42', ' 3.14 ', '', '12px', '0x1F', '1e3'];
const parsed = inputs.map((s) => Number(s));
console.log(parsed);
// Ungültige Eingaben herausfiltern (leere Strings gesondert behandeln)
const valid = inputs
.filter((s) => s.trim() !== '')
.map(Number)
.filter(Number.isFinite);
console.log(valid);
Umwandlungsregeln für verschiedene Typen
console.log(Number(true), Number(false));
console.log(Number(null), Number(undefined));
console.log(Number([]), Number([7]), Number([1, 2]));
console.log(Number(new Date(0)));
console.log(Number(10n));
Fallstrick: Number-Objekte sind immer truthy
const zero = new Number(0);
if (zero) {
console.log('Wird ausgeführt, obwohl der Wert 0 ist!');
}
// Richtig: primitiven Wert prüfen
if (!zero.valueOf()) {
console.log('Wert ist 0');
}
// Wichtig · Fallstricke
- Verzichte auf
new Number(): Wrapper-Objekte sind immer truthy, auchnew Number(0). Bei===werden sie nach Identität verglichen, zwei Objekte mit gleichem Wert sind also nie gleich. ESLint meldet sie mit der Regelno-new-wrappers. Number("")undNumber(" ")ergeben0und nichtNaN. Leere Eingaben musst du deshalb vorher selbst prüfen.- Präfixe wie
0x,0bund0owerden erkannt. Ein Zahlentrenner wie in"1_000"ist nicht erlaubt und ergibtNaN. - Bei
Number(bigint)geht Genauigkeit verloren, sobald der Wert größer alsNumber.MAX_SAFE_INTEGERist.new Number(10n)funktioniert zwar, der unäre Operator+10nwirft dagegen einenTypeError. - Prüfe auf
NaNmitNumber.isNaN()statt mit=== NaN, denn dieser Vergleich ist immerfalse. - Für die Kompatibilität gibt es keine Einschränkungen: Der Konstruktor gehört seit ES1 zum Standard und läuft in allen Browsern und in Node.js.