Signatur
Beschreibung
Symbol.toStringTag ist eine statische Dateneigenschaft von Symbol und enthält eines der sogenannten bekannten Symbole (well-known symbols). Object.prototype.toString() fragt diese Eigenschaft am Objekt ab. Ist ihr Wert ein String, erscheint er als Tag in der Ausgabe [object Tag].
Viele eingebaute Objekte haben die Eigenschaft bereits, z. B. Map, Set, Promise, Symbol, ArrayBuffer, JSON, Math sowie Generator- und Async-Funktionen. Auch zahlreiche DOM- und Web-API-Objekte bekommen ihre Tags wie [object HTMLDivElement] auf diesem Weg. Bei Array, Date, RegExp, Error und Function ermittelt die Engine den Tag dagegen über interne Slots.
Eigene Klassen liefern ohne diese Eigenschaft nur [object Object]. Mit einem Getter get [Symbol.toStringTag]() machen Sie Ihre Objekte in Logs, beim Debuggen und bei generischen Typprüfungen über Object.prototype.toString.call() leichter erkennbar.
Die Eigenschaft selbst ist nicht beschreibbar, nicht aufzählbar und nicht konfigurierbar (writable: false, enumerable: false, configurable: false).
Rückgabewert
Symbol.toStringTag. Nutzen Sie es als Eigenschaftsschlüssel, dessen Wert ein string sein sollte.Beispiele
Eingebaute Tags auslesen
const tag = (value) => Object.prototype.toString.call(value);
console.log(tag(new Map()));
console.log(tag(Promise.resolve()));
console.log(tag(Symbol('x')));
console.log(tag(function* () {}));
console.log(tag(null));
console.log(new Map()[Symbol.toStringTag]);
Eigene Klasse mit sprechendem Tag
class Warenkorb {
#artikel = [];
hinzufuegen(name) {
this.#artikel.push(name);
return this;
}
get [Symbol.toStringTag]() {
return 'Warenkorb';
}
}
const korb = new Warenkorb().hinzufuegen('Kaffee');
console.log(Object.prototype.toString.call(korb));
console.log(String(korb));
console.log(`${korb}`);
Generische Typprüfung in einer Hilfsfunktion
const typVon = (value) =>
Object.prototype.toString.call(value).slice(8, -1);
const werte = [[], new Date(), /re/, new Set(), 42, 'text', undefined];
console.log(werte.map(typVon));
Dynamischer Tag abhängig vom Zustand
class Verbindung {
constructor() {
this.offen = false;
}
get [Symbol.toStringTag]() {
return this.offen ? 'Verbindung:offen' : 'Verbindung:geschlossen';
}
}
const v = new Verbindung();
console.log(`${v}`);
v.offen = true;
console.log(`${v}`);
// Wichtig · Fallstricke
- Keine zuverlässige Typprüfung: Jedes Objekt kann den Tag frei setzen, z. B.
{ [Symbol.toStringTag]: 'Array' }liefert[object Array]. Für echte Prüfungen nutzen SieArray.isArray(),instanceofoder Brand-Checks mit privaten Feldern (#feld in obj). - Ist der Wert kein String, wird er ignoriert. Dann greift der Standard-Tag, meist
Object. - Der Tag wirkt nur, wenn
Object.prototype.toStringtatsächlich aufgerufen wird. Überschreibt eine KlassetoString(), oder ruftArray.prototype.toStringdie Methodejoinauf, spielt der Tag keine Rolle. - Definieren Sie den Tag am besten als Getter auf dem Prototyp (
get [Symbol.toStringTag]()) statt als Instanzfeld. So taucht er nicht inObject.keys()oder beiJSON.stringifyauf. Als Symbol-Schlüssel ist er dort ohnehin ausgeschlossen. - Die Konsolen-Ausgabe (
console.log(obj)) in Node.js und im Browser kann den Tag berücksichtigen, zum BeispielWarenkorb [Warenkorb] {}. Das Format ist aber nicht standardisiert. - Kompatibilität: Baseline, alle modernen Browser und Node.js ab Version 6. In älteren Umgebungen wie dem Internet Explorer fehlt die Unterstützung.