Signatur
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
"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());
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));
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(', '));
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);
// Wichtig · Fallstricke
- Keine implizite Umwandlung: Template-Literale,
+-Verkettung mit Strings undString.prototype.concat()werfen bei Symbolen einenTypeError.String(sym)funktioniert dagegen und liefert dasselbe Ergebnis wiesym.toString(). - Nicht eindeutig: Zwei verschiedene Symbole mit derselben Beschreibung ergeben denselben String.
Symbol('a').toString() === Symbol('a').toString()isttrue, 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ücklichundefinedü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 einenTypeError. - 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 einenTypeError. - Kompatibilität: Die Methode wird von allen modernen Browsern und von Node.js unterstützt (Baseline). Der Internet Explorer kennt keine Symbole.