Start · Sprachen · JavaScript · Referenz · Subtraktion (-)

Subtraktion (-)

Operator

Der Subtraktionsoperator <code>-</code> zieht den rechten Operanden vom linken ab und liefert die Differenz als <code>Number</code> oder <code>BigInt</code>.

seit JavaScript ES1 (Baseline: alle Browser); BigInt-Unterstützung Kategorie: syntax

Signatur

x - y

Beschreibung

Der binäre Operator - berechnet die Differenz zweier Werte. Anders als + ist er nicht überladen: Es gibt keine Zeichenketten-Verkettung. Beide Operanden werden zuerst in primitive Werte umgewandelt, danach in einen numerischen Wert (Number oder BigInt). Deshalb ergibt "10" - 3 die Zahl 7, während "10" + 3 die Zeichenkette "103" liefert.

Sind beide Operanden nach der Umwandlung BigInt, wird eine BigInt-Subtraktion durchgeführt. Ist nur einer davon BigInt, wird ein TypeError geworfen – Number und BigInt lassen sich nicht mischen. Bei Werten, die sich nicht sinnvoll in Zahlen umwandeln lassen (z. B. "abc", undefined, Objekte ohne passendes valueOf()), ist das Ergebnis NaN.

Typische Anwendungen sind Rechnungen mit Beträgen, Differenzen zwischen Zeitstempeln (Date-Objekte werden über valueOf() in Millisekunden umgewandelt) sowie Vergleichsfunktionen für Array.prototype.sort(), etwa (a, b) => a - b.

Die Subtraktion ist linksassoziativ: a - b - c wird als (a - b) - c ausgewertet. Sie hat dieselbe Rangfolge wie die Addition, aber eine niedrigere als Multiplikation, Division und Rest.

Parameter

Name Typ Default Beschreibung
$x Pflicht number|bigint|any Minuend – der Wert, von dem abgezogen wird. Wird zu einem primitiven Wert und dann zu Number bzw. BigInt umgewandelt.
$y Pflicht number|bigint|any Subtrahend – der abzuziehende Wert. Muss nach der Umwandlung denselben numerischen Typ haben wie x, sonst TypeError.

Rückgabewert

Typ
number|bigint
Beschreibung
Die Differenz x - y. BigInt, wenn beide Operanden BigInt sind, sonst Number (eventuell NaN, Infinity oder -Infinity).

Beispiele

Grundlagen und implizite Typumwandlung

console.log(5 - 3);          // Zahlen
console.log(3.5 - 5);        // negatives Ergebnis
console.log('10' - '4');     // Strings werden zu Zahlen
console.log('10' - 4);
console.log('abc' - 1);      // nicht umwandelbar
console.log(true - false);   // true → 1, false → 0
console.log(null - 1);       // null → 0
console.log(undefined - 1);  // undefined → NaN
console.log(Infinity - Infinity);
2 -1.5 6 6 NaN 1 -1 NaN NaN

Zeitdifferenz zwischen zwei Datumsangaben

const start = new Date('2024-03-01T08:00:00');
const ende = new Date('2024-03-01T17:30:00');

const diffMs = ende - start; // Date → Millisekunden via valueOf()
const stunden = diffMs / (1000 * 60 * 60);

console.log(`Arbeitszeit: ${stunden} Stunden`);
Arbeitszeit: 9.5 Stunden

Numerisch sortieren mit einer Vergleichsfunktion

const preise = [19.99, 5, 120, 42.5, 7];

const aufsteigend = [...preise].sort((a, b) => a - b);
const absteigend = [...preise].sort((a, b) => b - a);

console.log(aufsteigend);
console.log(absteigend);
[5, 7, 19.99, 42.5, 120] [120, 42.5, 19.99, 7, 5]

BigInt-Subtraktion und gemischte Typen

const gross = 9007199254740993n;
console.log(gross - 1n);

try {
  console.log(gross - 1); // BigInt und Number gemischt
} catch (err) {
  console.log(err.constructor.name, err.message);
}

// Explizit umwandeln:
console.log(gross - BigInt(1));
9007199254740992n TypeError Cannot mix BigInt and other types, use explicit conversions 9007199254740992n

Gleitkomma-Ungenauigkeit bei Geldbeträgen umgehen

console.log(0.3 - 0.1);

// Besser: in Cent (ganzen Zahlen) rechnen
const betragCent = 30 - 10;
console.log((betragCent / 100).toFixed(2));
0.19999999999999998 0.20

// Wichtig · Fallstricke

  • Gleitkomma-Fehler: Number nutzt IEEE-754-Doppelgenauigkeit. 0.3 - 0.1 ergibt nicht exakt 0.2. Für Geldbeträge in ganzen Einheiten (Cent) rechnen oder mit Number.EPSILON vergleichen.
  • Kein String-Verhalten: Anders als bei + wird nie verkettet. Deshalb erzwingt str - 0 zwar eine Umwandlung in eine Zahl, lesbarer sind aber Number(str) oder das unäre +str.
  • Leere Werte: "" - 1 und [] - 1 ergeben -1, weil "" und [] zu 0 werden. Das kann Fehler bei Formulareingaben verschleiern – Eingaben vorher prüfen.
  • BigInt: Mischt man BigInt mit Number, gibt es einen TypeError. Ein unäres Minus funktioniert bei BigInt (-5n), ein unäres Plus (+5n) dagegen nicht.
  • Nicht mit dem unären Minus verwechseln: a - -b ist gültig, a--b dagegen ein Syntaxfehler, weil es als Dekrement-Operator gelesen wird.
  • Sonderwerte: Infinity - Infinity ist NaN, 0 - 0 ist 0 und -0 - 0 ist -0.
  • Objekte: Die Umwandlung ruft [Symbol.toPrimitive] mit dem Hinweis "number" auf, danach valueOf() und dann toString().