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

Symbol.prototype.toString()

Methode

Gibt eine String-Darstellung des Symbols im Format <code>"Symbol(beschreibung)"</code> zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Symbol.prototype.toString()

Beschreibung

Die Methode toString() wandelt einen Symbolwert in einen lesbaren String der Form "Symbol(beschreibung)" um. Die Beschreibung ist der optionale String, den man beim Aufruf von Symbol() oder Symbol.for() übergeben hat. Ohne Beschreibung lautet das Ergebnis "Symbol()".

Man braucht sie vor allem beim Debuggen, Loggen und in Fehlermeldungen. Symbole werden nämlich nicht implizit in Strings umgewandelt: Ausdrücke wie "" + sym oder `${sym}` werfen einen TypeError. Die Umwandlung muss ausdrücklich passieren, also mit sym.toString() oder String(sym).

Symbol.prototype hat eine eigene toString()-Methode. Deshalb wird Object.prototype.toString() nicht verwendet. Wer nur die Beschreibung ohne den Rahmen Symbol(...) braucht, nimmt besser die Eigenschaft Symbol.prototype.description (ES2019).

Rückgabewert

Typ
string
Beschreibung
Ein String im Format "Symbol(beschreibung)". Ohne Beschreibung lautet er "Symbol()".

Beispiele

Grundlegende Umwandlung

const id = Symbol('benutzerId');
const leer = Symbol();
const global = Symbol.for('app.config');

console.log(id.toString());
console.log(leer.toString());
console.log(global.toString());
console.log(Symbol.iterator.toString());
Symbol(benutzerId) Symbol() Symbol(app.config) Symbol(Symbol.iterator)

Implizite Umwandlung schlägt fehl – explizit umwandeln

const token = Symbol('sessionToken');

try {
  console.log(`Token: ${token}`);
} catch (err) {
  console.log(err.constructor.name);
}

// Richtig: explizit umwandeln
console.log(`Token: ${token.toString()}`);
console.log('Token: ' + String(token));
TypeError Token: Symbol(sessionToken) Token: Symbol(sessionToken)

Symbol-Schlüssel eines Objekts protokollieren

const INTERN = Symbol('intern');
const VERSION = Symbol('version');

const modul = {
  name: 'Logger',
  [INTERN]: true,
  [VERSION]: '2.1.0'
};

const schluessel = Object.getOwnPropertySymbols(modul)
  .map((sym) => sym.toString());

console.log(schluessel.join(', '));
Symbol(intern), Symbol(version)

toString() im Vergleich zu description

const sym = Symbol('farbe');

console.log(sym.toString());   // mit Rahmen
console.log(sym.description);  // nur die Beschreibung
console.log(Symbol().description);
Symbol(farbe) farbe undefined

// Wichtig · Fallstricke

  • Keine implizite Umwandlung: Template-Literale, +-Verkettung mit Strings und String.prototype.concat() werfen bei Symbolen einen TypeError. String(sym) funktioniert dagegen und liefert dasselbe Ergebnis wie sym.toString().
  • Nicht eindeutig: Zwei verschiedene Symbole mit derselben Beschreibung ergeben denselben String. Symbol('a').toString() === Symbol('a').toString() ist true, obwohl die Symbole selbst ungleich sind. Das Ergebnis taugt daher nicht als Schlüssel oder zur Identifizierung.
  • Als Beschreibung wird immer ein String gespeichert: Symbol(42).toString() ergibt "Symbol(42)". Wird ausdrücklich undefined übergeben, entsteht "Symbol()".
  • Wird die Methode auf einem Wert aufgerufen, der weder ein Symbol noch ein Symbol-Wrapper-Objekt ist, zum Beispiel mit Symbol.prototype.toString.call('x'), gibt es einen TypeError.
  • Wird die Methode auf einem Wert aufgerufen, der weder ein Symbol noch ein Symbol-Wrapper-Objekt ist, zum Beispiel mit Symbol.prototype.toString.call('x'), gibt es einen TypeError.
  • Kompatibilität: Die Methode wird von allen modernen Browsern und von Node.js unterstützt (Baseline). Der Internet Explorer kennt keine Symbole.