Start · Sprachen · JavaScript · Referenz · new Number()

new Number()

Methode

Der <code>Number()</code>-Konstruktor erzeugt mit <code>new</code> ein Number-Wrapper-Objekt. Ohne <code>new</code> aufgerufen, wandelt er einen Wert in eine primitive Zahl um.

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

Signatur

new Number(value)

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

Typ
Number | number
Beschreibung
Mit 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);
object number true false true

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);
[42, 3.14, 0, NaN, 31, 1000] [42, 3.14, 31, 1000]

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));
1 0 0 NaN 0 7 NaN 0 10

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');
}
Wird ausgeführt, obwohl der Wert 0 ist! Wert ist 0

// Wichtig · Fallstricke

  • Verzichte auf new Number(): Wrapper-Objekte sind immer truthy, auch new Number(0). Bei === werden sie nach Identität verglichen, zwei Objekte mit gleichem Wert sind also nie gleich. ESLint meldet sie mit der Regel no-new-wrappers.
  • Number("") und Number(" ") ergeben 0 und nicht NaN. Leere Eingaben musst du deshalb vorher selbst prüfen.
  • Präfixe wie 0x, 0b und 0o werden erkannt. Ein Zahlentrenner wie in "1_000" ist nicht erlaubt und ergibt NaN.
  • Bei Number(bigint) geht Genauigkeit verloren, sobald der Wert größer als Number.MAX_SAFE_INTEGER ist. new Number(10n) funktioniert zwar, der unäre Operator +10n wirft dagegen einen TypeError.
  • Prüfe auf NaN mit Number.isNaN() statt mit === NaN, denn dieser Vergleich ist immer false.
  • 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.