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

Temporal.PlainMonthDay.prototype.valueOf()

Methode

Wirft immer einen <code>TypeError</code>. So wird verhindert, dass <code>Temporal.PlainMonthDay</code>-Instanzen bei Vergleichen oder Rechenoperationen stillschweigend in Primitive umgewandelt werden.

seit JavaScript ES2026 (Temporal, Stage 4) – Firefox 139+, Chrome Kategorie: method-property

Signatur

Temporal.PlainMonthDay.prototype.valueOf()

Beschreibung

Normalerweise ruft JavaScript valueOf() automatisch auf, wenn ein Objekt in einen primitiven Wert umgewandelt werden muss, zum Beispiel bei <, >, - oder +. Bei Temporal.PlainMonthDay ist diese Methode absichtlich so gebaut, dass sie immer einen TypeError wirft. Ausdrücke wie md1 < md2 oder md1 - md2 scheitern also sofort mit einem Fehler und liefern kein stilles, falsches Ergebnis.

Der Grund: Bei Date gibt valueOf() einen Zeitstempel zurück. Deshalb funktionieren Vergleiche dort scheinbar, verleiten aber oft zu Fehlern. Temporal verlangt dagegen, dass du ausdrücklich sagst, was du willst. Für PlainMonthDay gibt es zudem keine statische Methode compare(), weil die Reihenfolge von Monat und Tag ohne Jahr und Kalender nicht eindeutig ist. Auf Gleichheit prüfst du mit equals(). Zum Sortieren wandelst du den Wert mit toPlainDate({ year }) in ein festes Jahr um und nutzt dann Temporal.PlainDate.compare().

In Zeichenketten umwandeln lässt sich die Instanz trotzdem: Template-Literale und String(md) rufen über Symbol.toPrimitive mit dem Hinweis „string“ die Methode toString() auf. valueOf() kommt dabei nicht zum Zug. Der Operator + mit einer Zeichenkette ("" + md) nutzt dagegen den Hinweis „default“, ruft zuerst valueOf() auf und wirft deshalb ebenfalls.

Rückgabewert

Typ
never
Beschreibung
Kein Rückgabewert: Die Methode wirft bei jedem Aufruf einen TypeError.

Beispiele

Vergleichsoperatoren lösen einen TypeError aus

const geburtstag = Temporal.PlainMonthDay.from('03-14');
const heute = Temporal.PlainMonthDay.from('07-01');

try {
  console.log(geburtstag < heute);
} catch (err) {
  console.log(err instanceof TypeError); // true
}
true

Richtig: Gleichheit mit equals() prüfen

const weihnachten = Temporal.PlainMonthDay.from({ month: 12, day: 24 });
const heute = Temporal.Now.plainDateISO();

const istHeiligabend = weihnachten.equals(heute.toPlainMonthDay());
console.log(istHeiligabend ? 'Frohe Weihnachten!' : 'Noch nicht Heiligabend');
Noch nicht Heiligabend (je nach Datum)

Sortieren über ein festes Bezugsjahr

const termine = ['12-24', '02-29', '07-04', '01-01']
  .map((s) => Temporal.PlainMonthDay.from(s));

// Schaltjahr als Bezug, damit der 29. Februar gültig bleibt
const sortiert = termine.toSorted((a, b) =>
  Temporal.PlainDate.compare(
    a.toPlainDate({ year: 2024 }),
    b.toPlainDate({ year: 2024 })
  )
);

console.log(sortiert.map((md) => md.toString()));
[ '01-01', '02-29', '07-04', '12-24' ]

String-Konvertierung: Template-Literal ja, + nein

const md = Temporal.PlainMonthDay.from('10-03');

console.log(`Feiertag: ${md}`); // ruft toString() auf
console.log(String(md));

try {
  console.log('Feiertag: ' + md); // Hinweis "default" führt zu valueOf()
} catch (err) {
  console.log(err.name);
}
Feiertag: 10-03 10-03 TypeError

// Wichtig · Fallstricke

  • Fallstrick +-Operator: 'Text ' + md wirft einen Fehler. Verwende Template-Literale, String(md) oder md.toString().
  • Kein compare(): Anders als PlainDate oder PlainTime hat PlainMonthDay keine statische Vergleichsmethode. Zum Sortieren wandelst du in ein PlainDate mit festem Jahr um. Nimm ein Schaltjahr, sonst wird der 02-29 auf den 02-28 verschoben.
  • == und === vergleichen Objektreferenzen und werfen keinen Fehler. Zwei gleiche Monat-Tag-Werte ergeben trotzdem false. Nutze equals().
  • JSON: JSON.stringify() funktioniert, weil toJSON() vorhanden ist. valueOf() wird dabei nicht aufgerufen.
  • Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar (Safari fehlt bisher). Bei Bedarf hilft ein Polyfill wie @js-temporal/polyfill oder temporal-polyfill.