Signatur
Beschreibung
Object.prototype.toString() wird von JavaScript automatisch aufgerufen, wenn ein Objekt in eine Zeichenkette umgewandelt werden muss, etwa bei Template-Literalen, String-Verkettung mit + oder String(obj). Für einfache Objekte liefert die Standard-Implementierung "[object Object]", was selten aussagekräftig ist.
Viele eingebaute Typen überschreiben die Methode: Array.prototype.toString() verbindet die Elemente mit Kommas, Date.prototype.toString() liefert ein lesbares Datum, Function.prototype.toString() den Quelltext. In eigenen Klassen lohnt es sich, toString() zu überschreiben, damit Objekte beim Loggen oder bei der Ausgabe in der Oberfläche eine sinnvolle Darstellung haben.
Ein bekanntes Muster ist der Aufruf über Object.prototype.toString.call(wert): Damit umgeht man überschriebene Varianten und erhält den internen Typ-Bezeichner, z. B. "[object Array]", "[object Null]" oder "[object Date]". Der Bezeichner wird seit ES2015 über die Eigenschaft Symbol.toStringTag bestimmt, die man für eigene Klassen selbst setzen kann.
Rückgabewert
"[object Typ]", wobei Typ aus Symbol.toStringTag oder dem internen Objekttyp abgeleitet wird.Beispiele
Standardverhalten und implizite Umwandlung
const user = { name: 'Anna', role: 'admin' };
console.log(user.toString());
console.log(`Benutzer: ${user}`);
console.log(String([1, 2, 3])); // Array überschreibt toString()
Zuverlässige Typprüfung mit call()
const typeOf = (value) =>
Object.prototype.toString.call(value).slice(8, -1);
console.log(typeOf(null));
console.log(typeOf(undefined));
console.log(typeOf([]));
console.log(typeOf(new Date()));
console.log(typeOf(/abc/));
console.log(typeOf(new Map()));
console.log(typeOf(Promise.resolve()));
toString() in eigener Klasse überschreiben
class Money {
constructor(amount, currency) {
this.amount = amount;
this.currency = currency;
}
toString() {
return `${this.amount.toFixed(2)} ${this.currency}`;
}
}
const price = new Money(19.9, 'EUR');
console.log(`Gesamtpreis: ${price}`);
console.log('Preis: ' + price);
Typ-Bezeichner über Symbol.toStringTag setzen
class ApiClient {
get [Symbol.toStringTag]() {
return 'ApiClient';
}
}
const client = new ApiClient();
console.log(Object.prototype.toString.call(client));
console.log(String(client));
// Wichtig · Fallstricke
- Überschriebene Varianten:
[1, 2].toString()liefert"1,2", nicht"[object Array]". Für die Typprüfung immerObject.prototype.toString.call(wert)verwenden. - Nicht fälschungssicher: Seit ES2015 kann jedes Objekt über
Symbol.toStringTageinen beliebigen Bezeichner vortäuschen. Für Arrays istArray.isArray()die robustere Prüfung. - Objekte ohne Prototyp:
Object.create(null)besitzt keintoString();`${obj}`wirft dann einenTypeError. - Umwandlungsreihenfolge: Bei der Umwandlung in einen primitiven Wert hat
Symbol.toPrimitiveVorrang. Für den Hinweis"string"wirdtoString()vorvalueOf()probiert, bei+mit Hinweis"default"meist zuerstvalueOf(). - Kein Ersatz für Serialisierung: Zum Speichern oder Übertragen von Daten
JSON.stringify()verwenden, denntoString()ist nur für die Darstellung gedacht.