Signatur
Beschreibung
Symbol.keyFor() ist das Gegenstück zu Symbol.for(): Während Symbol.for(key) ein Symbol im globalen Symbolregister anlegt oder ein vorhandenes abruft, liefert Symbol.keyFor(sym) den Schlüssel-String zu einem solchen registrierten Symbol.
Nützlich ist die Methode vor allem, um festzustellen, ob ein Symbol global geteilt ist (etwa über iframes, Worker-übergreifenden Code oder verschiedene Bibliotheken hinweg), oder um aus einem registrierten Symbol wieder einen serialisierbaren Bezeichner zu gewinnen, z. B. für Logging oder Debugging.
Symbole, die mit Symbol() erzeugt wurden, sowie die sogenannten Well-known Symbols wie Symbol.iterator sind nicht im globalen Register eingetragen – für sie gibt Symbol.keyFor() undefined zurück.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $sym Pflicht | symbol | Das Symbol, dessen Schlüssel im globalen Symbolregister gesucht werden soll. Muss ein Wert vom Typ symbol sein, sonst wird ein TypeError geworfen. |
Rückgabewert
Symbol.for() im globalen Register angelegt wurde; andernfalls undefined.Beispiele
Schlüssel eines registrierten Symbols abrufen
const appId = Symbol.for('app.id');
console.log(Symbol.keyFor(appId));
console.log(Symbol.for('app.id') === appId);
Lokale und Well-known Symbols sind nicht registriert
const lokal = Symbol('app.id');
console.log(Symbol.keyFor(lokal));
console.log(Symbol.keyFor(Symbol.iterator));
// Die Beschreibung ist trotzdem verfügbar:
console.log(lokal.description);
Prüfen, ob ein Symbol global geteilt ist
const istGlobal = (sym) =>
typeof sym === 'symbol' && Symbol.keyFor(sym) !== undefined;
const meta = {
[Symbol.for('lib.version')]: '2.1.0',
[Symbol('intern')]: true
};
for (const sym of Object.getOwnPropertySymbols(meta)) {
console.log(sym.toString(), istGlobal(sym) ? 'global' : 'lokal');
}
TypeError bei Nicht-Symbol abfangen
try {
Symbol.keyFor('app.id');
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- TypeError: Wird kein Symbol übergeben (z. B. ein String), wirft die Methode einen
TypeError– es erfolgt keine Typumwandlung. - Nicht mit
descriptionverwechseln:sym.descriptionliefert die Beschreibung jedes Symbols;Symbol.keyFor()nur den Registerschlüssel. Bei registrierten Symbolen sind beide gleich, bei lokalen liefertkeyForundefined. - Das globale Register ist realm-übergreifend: Ein mit
Symbol.for('x')in einem iframe erzeugtes Symbol ist identisch mit dem im Hauptfenster. - Registrierte Symbole werden nie vom Garbage Collector freigegeben und können daher nicht als Schlüssel in
WeakMap/WeakRefverwendet werden (ES2023). - Kompatibilität: in allen modernen Browsern und Node.js unterstützt; nicht im Internet Explorer.