Start · Sprachen · JavaScript · Referenz · Object.prototype.toString()

Object.prototype.toString()

Methode

Gibt eine Zeichenkette zurück, die das Objekt darstellt – standardmäßig im Format <code>"[object Typ]"</code>.

seit JavaScript ES1 (Symbol.toStringTag seit ES2015) – Baseline: a Kategorie: method-property

Signatur

Object.prototype.toString()

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

Typ
string
Beschreibung
Eine Zeichenkette, die das Objekt darstellt. Bei der Standard-Implementierung hat sie das Format "[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()
[object Object] Benutzer: [object Object] 1,2,3

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()));
Null Undefined Array Date RegExp Map Promise

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);
Gesamtpreis: 19.90 EUR Preis: 19.90 EUR

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));
[object ApiClient] [object ApiClient]

// Wichtig · Fallstricke

  • Überschriebene Varianten: [1, 2].toString() liefert "1,2", nicht "[object Array]". Für die Typprüfung immer Object.prototype.toString.call(wert) verwenden.
  • Nicht fälschungssicher: Seit ES2015 kann jedes Objekt über Symbol.toStringTag einen beliebigen Bezeichner vortäuschen. Für Arrays ist Array.isArray() die robustere Prüfung.
  • Objekte ohne Prototyp: Object.create(null) besitzt kein toString(); `${obj}` wirft dann einen TypeError.
  • Umwandlungsreihenfolge: Bei der Umwandlung in einen primitiven Wert hat Symbol.toPrimitive Vorrang. Für den Hinweis "string" wird toString() vor valueOf() probiert, bei + mit Hinweis "default" meist zuerst valueOf().
  • Kein Ersatz für Serialisierung: Zum Speichern oder Übertragen von Daten JSON.stringify() verwenden, denn toString() ist nur für die Darstellung gedacht.