Signatur
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
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);
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`);
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);
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));
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));
// Wichtig · Fallstricke
- Gleitkomma-Fehler:
Numbernutzt IEEE-754-Doppelgenauigkeit.0.3 - 0.1ergibt nicht exakt0.2. Für Geldbeträge in ganzen Einheiten (Cent) rechnen oder mitNumber.EPSILONvergleichen. - Kein String-Verhalten: Anders als bei
+wird nie verkettet. Deshalb erzwingtstr - 0zwar eine Umwandlung in eine Zahl, lesbarer sind aberNumber(str)oder das unäre+str. - Leere Werte:
"" - 1und[] - 1ergeben-1, weil""und[]zu0werden. Das kann Fehler bei Formulareingaben verschleiern – Eingaben vorher prüfen. - BigInt: Mischt man
BigIntmitNumber, gibt es einenTypeError. Ein unäres Minus funktioniert bei BigInt (-5n), ein unäres Plus (+5n) dagegen nicht. - Nicht mit dem unären Minus verwechseln:
a - -bist gültig,a--bdagegen ein Syntaxfehler, weil es als Dekrement-Operator gelesen wird. - Sonderwerte:
Infinity - InfinityistNaN,0 - 0ist0und-0 - 0ist-0. - Objekte: Die Umwandlung ruft
[Symbol.toPrimitive]mit dem Hinweis"number"auf, danachvalueOf()und danntoString().