| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Symbol | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit September 2015 browserbergreifend verfgbar.
* Einige Teile dieser Funktion werden mglicherweise unterschiedlich gut untersttzt.
Symbol ist ein integriertes Objekt, dessen Konstruktor einen primitiven Wert vom Typ symbol zurckgibt auch Symbol-Wert oder einfach Symbol genannt. Dieser Wert ist garantiert eindeutig. Symbole werden hufig verwendet, um einem Objekt eindeutige Property-Keys hinzuzufgen. Diese kollidieren nicht mit Keys, die anderer Code dem Objekt hinzufgen knnte, und bleiben vor den Mechanismen verborgen, mit denen anderer Code normalerweise auf das Objekt zugreift. Das ermglicht eine schwache Form der Kapselung beziehungsweise des Verbergens von Informationen.
Jeder Aufruf von Symbol() gibt garantiert ein eindeutiges Symbol zurck. Jeder Aufruf von Symbol.for("key") gibt fr denselben Wert von "key" immer dasselbe Symbol zurck. Wird Symbol.for("key") aufgerufen und ein Symbol mit dem angegebenen Key in der globalen Symbol-Registry gefunden, wird dieses Symbol zurckgegeben. Andernfalls wird ein neues Symbol erstellt, unter dem angegebenen Key in die globale Symbol-Registry aufgenommen und zurckgegeben.
Um einen neuen primitiven Symbol-Wert zu erstellen, schreiben Sie Symbol() und bergeben optional einen String als Beschreibung:
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
Der obige Code erstellt drei neue Symbole. Beachten Sie, dass Symbol("foo") den String "foo" nicht in ein Symbol umwandelt. Jeder Aufruf erstellt ein neues Symbol:
Symbol("foo") === Symbol("foo"); // false
Die folgende Syntax mit dem Operator new lst einen TypeError aus:
const sym = new Symbol(); // TypeError
Dies verhindert, dass statt eines neuen Symbol-Werts ausdrcklich ein Symbol-Wrapper-Objekt erstellt wird. Das kann berraschen, da sich Wrapper-Objekte fr primitive Datentypen normalerweise ausdrcklich erstellen lassen (beispielsweise mit new Boolean, new String und new Number).
Wenn Sie tatschlich ein Symbol-Wrapper-Objekt erstellen mchten, knnen Sie die Funktion Object() verwenden:
const sym = Symbol("foo");
typeof sym; // "symbol"
const symObj = Object(sym);
typeof symObj; // "object"
Symbole sind der einzige primitive Datentyp mit Referenzidentitt (das heit, Sie knnen dasselbe Symbol nicht zweimal erstellen). Daher verhalten sie sich in mancher Hinsicht wie Objekte. Beispielsweise knnen sie per Garbage Collection entfernt und deshalb in Objekten vom Typ WeakMap, WeakSet, WeakRef und FinalizationRegistry verwendet werden.
Die oben gezeigte Syntax mit der Funktion Symbol() erstellt ein Symbol, dessen Wert whrend der gesamten Laufzeit des Programms eindeutig bleibt. Um Symbole zu erstellen, die dateibergreifend und sogar ber verschiedene Realms hinweg verfgbar sind (von denen jeder seinen eigenen globalen Gltigkeitsbereich hat), verwenden Sie die Methoden Symbol.for() und Symbol.keyFor(), um Symbole in der globalen Symbol-Registry abzulegen und daraus abzurufen.
Beachten Sie, dass die globale Symbol-Registry nur ein gedankliches Konzept ist und keiner internen Datenstruktur der JavaScript-Engine entsprechen muss. Selbst wenn eine solche Registry existiert, kann JavaScript-Code nur ber die Methoden for() und keyFor() auf ihren Inhalt zugreifen.
Die Methode Symbol.for(tokenString) nimmt einen String-Key entgegen und gibt einen Symbol-Wert aus der Registry zurck. Symbol.keyFor(symbolValue) nimmt dagegen einen Symbol-Wert entgegen und gibt den zugehrigen String-Key zurck. Die Methoden sind zueinander invers, sodass Folgendes true ergibt:
Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true
Da registrierte Symbole an beliebiger Stelle erstellt werden knnen, verhalten sie sich fast genauso wie die Strings, denen sie zugeordnet sind. Deshalb ist ihre Eindeutigkeit nicht garantiert, und sie knnen nicht per Garbage Collection entfernt werden. Registrierte Symbole sind daher in Objekten vom Typ WeakMap, WeakSet, WeakRef und FinalizationRegistry nicht zulssig.
Alle statischen Properties des Symbol-Konstruktors sind selbst Symbole, deren Werte ber Realms hinweg konstant sind. Sie werden als bekannte Symbole bezeichnet. Sie dienen als Protokolle fr bestimmte integrierte JavaScript-Operationen und ermglichen es, das Verhalten der Sprache anzupassen. Hat eine Konstruktorfunktion beispielsweise eine Methode mit Symbol.hasInstance als Namen, legt diese Methode ihr Verhalten beim Operator instanceof fest.
Bevor es bekannte Symbole gab, verwendete JavaScript normale Properties, um bestimmte integrierte Operationen zu implementieren. Beispielsweise versucht die Funktion JSON.stringify, die Methode toJSON() jedes Objekts aufzurufen. Die Funktion String ruft die Methoden toString() und valueOf() des Objekts auf. Wenn der Sprache weitere Operationen hinzugefgt werden, kann jedoch die Zuweisung einer magischen Property fr jede Operation die Abwrtskompatibilitt beeintrchtigen und das Verhalten der Sprache schwerer nachvollziehbar machen. Bekannte Symbole ermglichen Anpassungen, die fr normalen Code unsichtbar sind, da dieser blicherweise nur auf Properties mit String-Keys zugreift.
Hinweis:
Die Spezifikation verwendete frher die Schreibweise @@<symbol-name>, um bekannte Symbole zu bezeichnen. Beispielsweise wurde Symbol.hasInstance als @@hasInstance geschrieben und die Methode Array.prototype[Symbol.iterator]() als Array.prototype[@@iterator]() bezeichnet. Diese Schreibweise wird in der Spezifikation nicht mehr verwendet, kann Ihnen aber noch in lterer Dokumentation oder in Diskussionen begegnen.
Bei bekannten Symbolen stellt sich die Frage der Entfernbarkeit per Garbage Collection nicht: Sie bilden eine feste Menge und bleiben whrend der gesamten Laufzeit des Programms eindeutig, hnlich wie intrinsische Objekte wie Array.prototype. Daher sind sie auch in Objekten vom Typ WeakMap, WeakSet, WeakRef und FinalizationRegistry zulssig.
Die Methode Object.getOwnPropertySymbols() gibt ein Array von Symbolen zurck und ermglicht es Ihnen, Symbol-Properties eines bestimmten Objekts zu finden. Beachten Sie, dass jedes Objekt zunchst keine eigenen Symbol-Properties besitzt. Das Array ist daher leer, solange Sie dem Objekt keine Symbol-Properties hinzugefgt haben.
Symbol()Gibt primitive Werte vom Typ Symbol zurck. Wird die Funktion mit new aufgerufen, lst sie einen Fehler aus.
Alle statischen Properties sind bekannte Symbole. In ihren Beschreibungen verwenden wir Formulierungen wie Symbol.hasInstance ist eine Methode, die bestimmt . Gemeint ist damit das Verhalten einer Objektmethode, die dieses Symbol als Methodennamen verwendet (da bekannte Symbole als Protokolle dienen), nicht der Wert des Symbols selbst.
Symbol.asyncDisposeEine Methode, die Ressourcen des Objekts asynchron freigibt, wenn das Objekt seinen Gltigkeitsbereich verlsst. Wird von der Deklaration await using verwendet.
Symbol.asyncIteratorEine Methode, die den standardmigen AsyncIterator eines Objekts zurckgibt. Wird von for await...of verwendet.
Symbol.disposeEine Methode, die Ressourcen des Objekts freigibt, wenn das Objekt seinen Gltigkeitsbereich verlsst. Wird von der Deklaration using verwendet.
Symbol.hasInstanceEine Methode, die bestimmt, ob ein Konstruktorobjekt ein Objekt als seine Instanz erkennt. Wird von instanceof verwendet.
Symbol.isConcatSpreadableEin Boolean-Wert, der angibt, ob ein Objekt in seine Array-Elemente aufgefchert werden soll. Wird von Array.prototype.concat() verwendet.
Symbol.iteratorEine Methode, die den standardmigen Iterator eines Objekts zurckgibt. Wird von for...of verwendet.
Symbol.matchEine Methode, die bereinstimmungen mit einem String ermittelt. Sie wird auch verwendet, um festzustellen, ob ein Objekt als regulrer Ausdruck verwendet werden kann. Wird von String.prototype.match() verwendet.
Symbol.matchAllEine Methode, die einen Iterator zurckgibt, der bereinstimmungen eines regulren Ausdrucks mit einem String liefert. Wird von String.prototype.matchAll() verwendet.
Symbol.replaceEine Methode, die passende Teilstrings eines Strings ersetzt. Wird von String.prototype.replace() verwendet.
Symbol.searchEine Methode, die den Index der Stelle in einem String zurckgibt, an der eine bereinstimmung mit dem regulren Ausdruck gefunden wird. Wird von String.prototype.search() verwendet.
Symbol.speciesEine Konstruktorfunktion, mit der abgeleitete Objekte erstellt werden.
Symbol.splitEine Methode, die einen String an den Stellen aufteilt, die einem regulren Ausdruck entsprechen. Wird von String.prototype.split() verwendet.
Symbol.toPrimitiveEine Methode, die ein Objekt in einen primitiven Wert umwandelt.
Symbol.toStringTagEin String-Wert, der fr die Standardbeschreibung eines Objekts verwendet wird. Wird von Object.prototype.toString() verwendet.
Symbol.unscopablesEin Objektwert, dessen eigene und geerbte Property-Namen aus den Umgebungsbindungen von with fr das zugehrige Objekt ausgeschlossen werden.
Symbol.for()Sucht in der globalen Symbol-Registry nach einem bereits registrierten Symbol mit dem angegebenen key und gibt es zurck, falls es gefunden wird. Andernfalls wird ein neues Symbol erstellt und unter key registriert.
Symbol.keyFor()Ruft fr das angegebene Symbol den Key eines gemeinsam genutzten Symbols aus der globalen Symbol-Registry ab.
Diese Properties sind auf Symbol.prototype definiert und werden von allen Symbol-Instanzen gemeinsam genutzt.
Symbol.prototype.constructorDie Konstruktorfunktion, die das Instanzobjekt erstellt hat. Bei Symbol-Instanzen ist der Anfangswert der Konstruktor Symbol.
Symbol.prototype.descriptionEin schreibgeschtzter String, der die Beschreibung des Symbols enthlt.
Symbol.prototype[Symbol.toStringTag]Der Anfangswert der Property [Symbol.toStringTag] ist der String "Symbol". Diese Property wird von Object.prototype.toString() verwendet. Da Symbol jedoch auch eine eigene Methode toString() besitzt, wird diese Property nur verwendet, wenn Sie Object.prototype.toString.call() mit einem Symbol als thisArg aufrufen.
Symbol.prototype.toString()Gibt einen String zurck, der die Beschreibung des Symbols enthlt. berschreibt die Methode Object.prototype.toString().
Symbol.prototype.valueOf()Gibt das Symbol zurck. berschreibt die Methode Object.prototype.valueOf().
Symbol.prototype[Symbol.toPrimitive]()Gibt das Symbol zurck.
Mit dem Operator typeof knnen Sie Symbole erkennen.
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
Bei der Typkonvertierung von Symbolen sollten Sie Folgendes beachten:
TypeError aus (beispielsweise +sym oder sym | 0).Object(sym) == sym den Wert true zurck.Symbol("foo") + "bar" lst einen TypeError aus (ein Symbol kann nicht in einen String umgewandelt werden). Das verhindert beispielsweise, dass aus einem Symbol unbemerkt ein neuer String-Property-Name entsteht.String(sym) funktioniert bei Symbolen wie ein Aufruf von Symbol.prototype.toString(). Beachten Sie jedoch, dass new String(sym) einen Fehler auslst.Symbole werden bei Iterationen mit for...in nicht aufgezhlt. Auch Object.getOwnPropertyNames() gibt keine Symbol-Properties eines Objekts zurck. Mit Object.getOwnPropertySymbols() knnen Sie diese jedoch abrufen.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (const i in obj) {
console.log(i);
}
// "c" "d"
Properties mit Symbol-Keys werden bei der Verwendung von JSON.stringify() vollstndig ignoriert:
JSON.stringify({ [Symbol("foo")]: "foo" });
// '{}'
Weitere Einzelheiten finden Sie unter JSON.stringify().
Wird ein Symbol-Wrapper-Objekt als Property-Key verwendet, wird dieses Objekt in das enthaltene Symbol umgewandelt:
const sym = Symbol("foo");
const obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-symbol-objects |
Symbol in core-jstypeofSymbolObject/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |