Start · Sprachen · JavaScript · Referenz · Temporal.PlainTime.prototype.valueOf()

Temporal.PlainTime.prototype.valueOf()

Methode

Wirft immer einen <code>TypeError</code> und verhindert so, dass <code>Temporal.PlainTime</code>-Instanzen implizit in Primitive umgewandelt und mit <code>&lt;</code>, <code>&gt;</code> oder <code>-</code> verglichen werden.

seit JavaScript ES2026 (Temporal); Firefox 139+, Chrome 144+, Safa Kategorie: method-property

Signatur

Temporal.PlainTime.prototype.valueOf()

Beschreibung

Die Methode valueOf() von Temporal.PlainTime ist absichtlich so gebaut, dass sie immer einen TypeError wirft. JavaScript ruft valueOf() automatisch auf, wenn ein Objekt in einen primitiven Wert umgewandelt werden soll, etwa bei arithmetischen Operatoren (-, +) oder relationalen Vergleichen (<, >, <=, >=). Bei Date liefert valueOf() einen Zeitstempel, bei Temporal.PlainTime wird dieses stillschweigende und fehleranfällige Verhalten dagegen bewusst unterbunden.

Ohne diese Sperre würde JavaScript auf toString() zurückgreifen und zwei Uhrzeiten als Zeichenketten vergleichen. Das liefert zwar oft ein plausibles Ergebnis, ist aber nicht zuverlässig. Deshalb erzwingt Temporal explizite Aufrufe: Zum Vergleichen verwenden Sie Temporal.PlainTime.compare() oder equals(), und für Zeitabstände until(), since() oder subtract().

Die Methode rufen Sie praktisch nie direkt auf. Wichtig ist sie vor allem dann, wenn Sie bestehenden Date-Code auf Temporal umstellen: Jeder Ausdruck wie a < b oder a - b mit PlainTime-Objekten führt jetzt zu einem Laufzeitfehler, statt ein falsches Ergebnis zu liefern.

Rückgabewert

Typ
never
Beschreibung
Gibt nie etwas zurück, sondern wirft bei jedem Aufruf einen TypeError.

Beispiele

Implizite Umwandlung löst TypeError aus

const start = Temporal.PlainTime.from('09:30');
const ende = Temporal.PlainTime.from('17:15');

try {
  console.log(start < ende);
} catch (err) {
  console.log(err instanceof TypeError, err.name);
}

try {
  console.log(ende - start);
} catch (err) {
  console.log('Subtraktion nicht erlaubt:', err.name);
}
true TypeError Subtraktion nicht erlaubt: TypeError

Richtig vergleichen mit compare() und equals()

const a = Temporal.PlainTime.from('08:00');
const b = Temporal.PlainTime.from('12:45:30');

console.log(Temporal.PlainTime.compare(a, b)); // -1, 0 oder 1
console.log(a.equals(Temporal.PlainTime.from('08:00:00')));

// Sortieren einer Liste von Uhrzeiten
const termine = ['14:00', '09:15', '11:30'].map((t) => Temporal.PlainTime.from(t));
termine.sort(Temporal.PlainTime.compare);
console.log(termine.map(String));
-1 true [ '09:15:00', '11:30:00', '14:00:00' ]

Zeitdifferenz explizit berechnen statt a - b

const arbeitsbeginn = Temporal.PlainTime.from('08:45');
const feierabend = Temporal.PlainTime.from('17:10');

const dauer = arbeitsbeginn.until(feierabend);
console.log(dauer.toString());
console.log(dauer.total({ unit: 'minutes' }));
PT8H25M 505

Prüfen, ob eine Uhrzeit im Öffnungszeitraum liegt

const oeffnet = Temporal.PlainTime.from('10:00');
const schliesst = Temporal.PlainTime.from('18:30');

const istGeoeffnet = (zeit) =>
  Temporal.PlainTime.compare(zeit, oeffnet) >= 0 &&
  Temporal.PlainTime.compare(zeit, schliesst) < 0;

console.log(istGeoeffnet(Temporal.PlainTime.from('12:00')));
console.log(istGeoeffnet(Temporal.PlainTime.from('19:00')));
true false

// Wichtig · Fallstricke

  • Migrationsfalle: Code, der mit Date funktioniert hat (d1 < d2, d2 - d1), wirft mit Temporal.PlainTime einen TypeError. Ersetzen Sie solche Ausdrücke durch compare(), equals() oder until()/since().
  • == und === werfen keinen Fehler: Sie vergleichen Objektreferenzen. Deshalb ergibt Temporal.PlainTime.from('10:00') === Temporal.PlainTime.from('10:00') den Wert false. Für einen Vergleich der Werte nutzen Sie equals().
  • Umwandlung in Zeichenketten funktioniert: Template-Literale und String(zeit) gehen über toString() und nicht über valueOf(). Sie sind also erlaubt, zum Beispiel `${zeit}` → "10:00:00". Der Operator + mit einer Zeichenkette ruft dagegen zuerst valueOf() auf und wirft deshalb einen Fehler.
  • Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar. Unterstützt wird es in Firefox ab 139 und in Chromium-Browsern ab 144, in Safari bisher nicht. Für Node.js und ältere Umgebungen gibt es ein Polyfill, z. B. @js-temporal/polyfill oder temporal-polyfill.