Start · Sprachen · JavaScript · Referenz · Unäres Plus (+)

Unäres Plus (+)

Operator

Der unäre Plus-Operator <code>+</code> wandelt seinen Operanden in eine Zahl um. Er ist die kürzeste Schreibweise für eine explizite Umwandlung in den Typ Number.

seit JavaScript ES1 (Baseline: alle Browser) Kategorie: syntax

Signatur

+operand

Beschreibung

Der unäre Plus-Operator steht vor genau einem Operanden. Er wendet die interne Operation ToNumber darauf an. Ist der Wert schon eine Zahl, bleibt er unverändert. Alle anderen Werte werden nach festen Regeln umgewandelt: true wird zu 1, false und null werden zu 0, undefined wird zu NaN. Strings werden als numerisches Literal gelesen.

Strings müssen vollständig eine gültige Zahl darstellen. Leerzeichen am Anfang und Ende werden ignoriert. Erlaubt sind Dezimalzahlen, Exponenten ("1e3"), "Infinity" und Präfixe wie 0x, 0b und 0o. Ein leerer String oder ein String nur aus Leerzeichen ergibt 0. Alles andere, zum Beispiel "12px", ergibt NaN. Objekte werden zuerst mit dem Hinweis "number" in einen primitiven Wert umgewandelt. Dabei werden Symbol.toPrimitive, valueOf() und toString() verwendet. Deshalb liefert +new Date() einen Zeitstempel.

In der Praxis nutzt man + vor allem für diese Fälle:

  • Formularwerte umwandeln, zum Beispiel aus input.value
  • Werte aus URL-Parametern oder localStorage in Zahlen umwandeln
  • einen Zeitstempel aus einem Date gewinnen

Das Ergebnis ist dasselbe wie bei Number(wert). Es gibt nur eine Ausnahme: BigInt-Werte. Wenn Lesbarkeit wichtiger ist als Kürze, ist Number() oft die klarere Wahl.

Parameter

Name Typ Default Beschreibung
$operand Pflicht any Beliebiger Ausdruck, der in eine Zahl umgewandelt werden soll. Bei BigInt und Symbol wird ein TypeError ausgelöst.

Rückgabewert

Typ
number
Beschreibung
Der in eine Zahl umgewandelte Wert. Ist keine sinnvolle Umwandlung möglich, ist das Ergebnis NaN. Der Rückgabewert ist nie ein BigInt.

Beispiele

Umwandlungsregeln im Überblick

const werte = ['42', ' 3.5 ', '', '0x1F', '1e3', '12px', true, false, null, undefined, [], [7], [1, 2], {}];

for (const w of werte) {
  console.log(JSON.stringify(w) ?? String(w), '→', +w);
}
"42" → 42 " 3.5 " → 3.5 "" → 0 "0x1F" → 31 "1e3" → 1000 "12px" → NaN true → 1 false → 0 null → 0 undefined → NaN [] → 0 [7] → 7 [1,2] → NaN {} → NaN

Formulareingaben summieren

// input.value ist immer ein String – ohne + würde '10' + '5' zu '105'
const preis = document.querySelector('#preis');
const menge = document.querySelector('#menge');

const berechne = () => {
  const p = +preis.value;
  const m = +menge.value;
  if (Number.isNaN(p) || Number.isNaN(m)) {
    return console.warn('Ungültige Eingabe');
  }
  console.log(`Summe: ${(p * m).toFixed(2)} €`);
};

berechne(); // bei preis = '19.90', menge = '3'
Summe: 59.70 €

Zeitstempel und eigene Objekte

const start = +new Date();          // entspricht Date.now()

const temperatur = {
  celsius: 21.5,
  [Symbol.toPrimitive](hint) {
    return hint === 'number' ? this.celsius : `${this.celsius} °C`;
  }
};

console.log(typeof start);   // 'number'
console.log(+temperatur);    // 21.5
console.log(`${temperatur}`); // '21.5 °C'
number 21.5 21.5 °C

Unterschied zu Number() und parseFloat()

console.log(+'12px', parseFloat('12px')); // NaN 12
console.log(Number(10n));                 // 10

try {
  console.log(+10n);
} catch (e) {
  console.log(e.constructor.name, e.message);
}
NaN 12 10 TypeError Cannot convert a BigInt value to a number

// Wichtig · Fallstricke

  • BigInt und Symbol: +10n und +Symbol() lösen einen TypeError aus. Number(10n) funktioniert dagegen und liefert 10.
  • Leere Strings: +"" und +" " ergeben 0, nicht NaN. Leere Formularfelder sehen deshalb schnell wie eine gültige Null aus. Prüfe vorher auf leere Eingaben.
  • Einheiten und Ziffern-Trenner: +"12px", +"1_000" und +"3,5" ergeben NaN. Für Werte mit Einheit wie 12px ist parseFloat() geeignet. Werte mit deutschem Dezimalkomma wie 3,5 musst du vorher selbst umformen.
  • Kein Oktal bei führender Null: +"010" ergibt 10. +"0o10" ergibt dagegen 8.
  • Verwechslungsgefahr: a + +b addiert a und den umgewandelten Wert von b. a ++b ist dagegen ein Syntaxfehler. Leerzeichen oder Klammern verbessern die Lesbarkeit.
  • NaN prüfen: Nutze Number.isNaN(). Ein Vergleich mit === NaN ist nie true.
  • TypeScript: +x hat immer den Typ number. Laufzeitfehler bei BigInt-Werten erkennt TypeScript aber nur teilweise.