Die Methode Date.prototype[Symbol.toPrimitive]() steuert, wie ein Date-Objekt in einen primitiven Wert umgewandelt wird, wenn die Sprachlaufzeit eine implizite Konvertierung benötigt. Sie hat Priorität vor valueOf() und toString() und entscheidet anhand eines hint-Parameters, ob ein String oder eine Zahl zurückgegeben wird. Damit ist sie die feinste Stellschraube für das Konvertierungsverhalten und löst die historisch mehrdeutige Situation, in der Date je nach Kontext mal als String und mal als Zahl interpretiert werden musste.
Funktionsweise
Wenn JavaScript ein Objekt in einen primitiven Wert umwandeln muss, wird zuerst [Symbol.toPrimitive] aufgerufen – falls vorhanden. Erst wenn diese Methode nicht existiert, fällt die Sprache auf valueOf() und toString() zurück.
Der hint-Parameter teilt der Methode den gewünschten Zieltyp mit:
| Hint | Wann ausgelöst | Date-Verhalten |
|---|---|---|
"string" | String-Kontext (z. B. Template-Literal) | wie toString() |
"number" | Numerischer Kontext (z. B. <, -) | wie valueOf() |
"default" | Mehrdeutig (z. B. +, ==) | bei Date wie "string" (besonderheit!) |
Diese Sonderbehandlung für "default" ist der Grund, weshalb date1 + date2 zwei String-Konkatenationen ergibt und nicht etwa eine Summe von Timestamps – ein historisches Erbe, das durch Symbol.toPrimitive explizit kodifiziert wurde.
Syntax
date[Symbol.toPrimitive](hint)hint Ein String aus "string", "number" oder "default". Wird von der Sprachlaufzeit automatisch passend zur Konvertierung gesetzt – manuell selten benötigt.
Rückgabewert
- Bei
hint === "string"oderhint === "default": Ein String wie vontoString(). - Bei
hint === "number": Eine Zahl wie vonvalueOf(). - Bei einem ungültigen
hintwirft die Methode einenTypeError.
Beispiele
Manueller Aufruf mit verschiedenen Hints
const date = new Date("2026-05-01T14:30:00Z");
console.log(date[Symbol.toPrimitive]("string"));
console.log(date[Symbol.toPrimitive]("number"));
console.log(date[Symbol.toPrimitive]("default"));Fri May 01 2026 16:30:00 GMT+0200 (Mitteleuropäische Sommerzeit)
1777689000000
Fri May 01 2026 16:30:00 GMT+0200 (Mitteleuropäische Sommerzeit)Sonderverhalten: + ergibt Strings, nicht Summe
Da hint === "default" bei Date in eine String-Konvertierung fällt, ergibt date + date eine Konkatenation.
const a = new Date("2026-05-01T00:00:00Z");
const b = new Date("2026-05-02T00:00:00Z");
console.log(typeof (a + b));
console.log(typeof (a - b));string
numberErzwungene numerische Konvertierung mit +
Der Unary-Plus-Operator nutzt hint === "number" und liefert den Timestamp.
const date = new Date("2026-05-01T00:00:00Z");
console.log(+date);1777593600000Vergleich: Hint-getriebene Konvertierung
const a = new Date("2026-05-01");
const b = new Date("2026-05-02");
console.log(a < b); // hint: "number"
console.log(`${a}`); // hint: "string"true
Fri May 01 2026 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit)Ungültiger Hint führt zu TypeError
const date = new Date();
try {
date[Symbol.toPrimitive]("xxx");
} catch (err) {
console.log(err.name, err.message);
}TypeError invalid hintHinweise & verwandte Methoden
Symbol.toPrimitiveist eine vorwärts-kompatible Erweiterung der älterenvalueOf()/toString()-Mechanik. Wer[Symbol.toPrimitive]definiert, übernimmt vollständig die Kontrolle.- Für manuelle Konvertierungen lieber explizit aufrufen:
date.getTime(),date.toISOString(),date.toLocaleString()– das ist deutlich lesbarer als+dateoderString(date). - Eigene Klassen können
[Symbol.toPrimitive]definieren, um Date-ähnliches Konvertierungsverhalten zu implementieren. - Bei JSON-Serialisierung wird nicht
[Symbol.toPrimitive]aufgerufen, sonderntoJSON().