Baseline Widely available *
Symbol
ist ein eingebautes Objekt, dessen Konstruktor einen symbol
primitiven Wert zurückgibt â auch als Symbolwert oder einfach Symbol bezeichnet â, der garantiert einzigartig ist. Symbole werden oft verwendet, um eindeutige Eigenschaftsschlüssel zu einem Objekt hinzuzufügen, die nicht mit Schlüsseln kollidieren, die anderer Code möglicherweise zu dem Objekt hinzufügt und die vor allen Mechanismen versteckt sind, die anderer Code typischerweise verwendet, um auf das Objekt zuzugreifen. Das ermöglicht eine Form der schwachen Kapselung oder eine schwache Form von Informationsverbergung.
Jeder Aufruf von Symbol()
garantiert die Rückgabe eines eindeutigen Symbols. Jeder Aufruf von Symbol.for("key")
gibt immer das gleiche Symbol für einen bestimmten Wert von "key"
zurück. Wenn Symbol.for("key")
aufgerufen wird und ein Symbol mit dem angegebenen Schlüssel im globalen Symbolregister gefunden werden kann, wird dieses Symbol zurückgegeben. Andernfalls wird ein neues Symbol erstellt, unter dem angegebenen Schlüssel zum globalen Symbolregister hinzugefügt und zurückgegeben.
Um ein neues primitives Symbol zu erstellen, schreiben Sie Symbol()
mit einem optionalen 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. Es erstellt jedes Mal ein neues Symbol:
Symbol("foo") === Symbol("foo"); // false
Die folgende Syntax mit dem new
Operator wirft einen TypeError
:
const sym = new Symbol(); // TypeError
Dies verhindert, dass Autoren ein explizites Symbol
Wrapper-Objekt anstelle eines neuen Symbolwerts erstellen, was überraschend sein kann, da das Erstellen von expliziten Wrapper-Objekten um primitive Datentypen in der Regel möglich ist (zum Beispiel new Boolean
, new String
und new Number
).
Wenn Sie wirklich ein Symbol
Wrapper-Objekt erstellen möchten, können Sie die Object()
Funktion verwenden:
const sym = Symbol("foo");
typeof sym; // "symbol"
const symObj = Object(sym);
typeof symObj; // "object"
Da Symbole der einzige primitive Datentyp sind, der eine Referenzidentität hat (das heiÃt, Sie können nicht zweimal dasselbe Symbol erstellen), verhalten sie sich in gewisser Weise wie Objekte. Zum Beispiel sind sie Garbage-Collectable und können daher in WeakMap
, WeakSet
, WeakRef
, und FinalizationRegistry
Objekten gespeichert werden.
Die obige Syntax mit der Symbol()
Funktion erstellt ein Symbol, dessen Wert während der gesamten Laufzeit des Programms einzigartig bleibt. Um Symbole zu erstellen, die über Dateien hinweg und sogar über Realms hinweg verfügbar sind (von denen jeder seinen eigenen globalen Gültigkeitsbereich hat), verwenden Sie die Methoden Symbol.for()
und Symbol.keyFor()
, um Symbole aus dem globalen Symbolregister zu setzen und abzurufen.
Beachten Sie, dass das "globale Symbolregister" nur ein fiktives Konzept ist und möglicherweise keiner internen Datenstruktur in der JavaScript-Engine entspricht â und selbst wenn ein solches Register existiert, steht dessen Inhalt dem JavaScript-Code nicht zur Verfügung, auÃer durch die for()
und keyFor()
Methoden.
Die Methode Symbol.for(tokenString)
nimmt einen String-Schlüssel und gibt einen Symbolwert aus dem Register zurück, während Symbol.keyFor(symbolValue)
einen Symbolwert nimmt und den entsprechenden String-Schlüssel zurückgibt. Jeder von ihnen ist das Inverse des anderen, sodass das Folgende true
ist:
Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true
Da registrierte Symbole beliebig überall erstellt werden können, verhalten sie sich fast genau wie die Strings, die sie umhüllen. Daher sind sie nicht garantiert einzigartig und nicht Garbage-Collectable. Daher sind registrierte Symbole in WeakMap
, WeakSet
, WeakRef
, und FinalizationRegistry
Objekten nicht erlaubt.
Alle statischen Eigenschaften des Symbol
Konstruktors sind selbst Symbole, deren Werte in allen Realms konstant sind. Sie sind als bekannte Symbole bekannt und dienen als "Protokolle" für bestimmte eingebaute JavaScript-Operationen, die es Benutzern ermöglichen, das Verhalten der Sprache anzupassen. Zum Beispiel, wenn eine Konstruktorfunktion eine Methode mit Symbol.hasInstance
als Namen hat, kodiert diese Methode ihr Verhalten mit dem instanceof
Operator.
Vor bekannten Symbolen verwendete JavaScript normale Eigenschaften, um bestimmte eingebaute Operationen zu implementieren. Zum Beispiel wird die JSON.stringify
Funktion versuchen, die toJSON()
Methode jedes Objekts aufzurufen, und die String
Funktion wird die toString()
und valueOf()
Methoden des Objekts aufrufen. Wenn jedoch mehr Operationen zur Sprache hinzugefügt werden, könnte das Zuweisen jeder Operation einer "magischen Eigenschaft" die Rückwärtskompatibilität gefährden und das Verhalten der Sprache schwerer nachvollziehbar machen. Bekannte Symbole ermöglichen es, dass die Anpassungen im normalen Code "unsichtbar" bleiben, der typischerweise nur String-Eigenschaften liest.
Hinweis: Die Spezifikation verwendete früher die Notation @@<symbol-name>
, um bekannte Symbole zu bezeichnen. Beispielsweise wurde Symbol.hasInstance
als @@hasInstance
geschrieben, und die Array.prototype[Symbol.iterator]()
Methode würde Array.prototype[@@iterator]()
genannt werden. Diese Notation wird in der Spezifikation nicht mehr verwendet, aber Sie könnten sie immer noch in älteren Dokumentationen oder Diskussionen sehen.
Bekannte Symbole haben nicht das Konzept der Garbage-Collectability, weil sie in einem festen Satz vorkommen und einzigartig während der gesamten Lebensdauer des Programms sind, ähnlich wie intrinsische Objekte wie Array.prototype
, daher sind sie auch in WeakMap
, WeakSet
, WeakRef
, und FinalizationRegistry
Objekten erlaubt.
Die Methode Object.getOwnPropertySymbols()
gibt ein Array von Symbolen zurück und lässt Sie Symboleigenschaften auf einem gegebenen Objekt finden. Beachten Sie, dass jedes Objekt ohne eigene Symboleigenschaften initialisiert wird, sodass dieses Array leer bleibt, es sei denn, Sie haben Symboleigenschaften auf dem Objekt gesetzt.
Symbol()
Gibt primitive Werte vom Typ Symbol zurück. Wirft einen Fehler, wenn mit new
aufgerufen.
Die statischen Eigenschaften sind alles bekannte Symbole. In den Beschreibungen dieser Symbole verwenden wir Formulierungen wie "Symbol.hasInstance
ist eine Methode, dieâ¦", aber beachten Sie, dass dies sich auf die Semantik der Methode eines Objekts bezieht, das dieses Symbol als Namen der Methode hat (weil bekannte Symbole als "Protokolle" fungieren), und nicht den Wert des Symbols selbst beschreibt.
Symbol.asyncDispose
Eine Methode, die Ressourcen des Objekts asynchron freigibt, wenn das Objekt aus dem Gültigkeitsbereich entfernt wird. Wird von der await using
Deklaration verwendet.
Symbol.asyncIterator
Eine Methode, die den Standard-AsyncIterator für ein Objekt zurückgibt. Wird von for await...of
verwendet.
Symbol.dispose
Eine Methode, die Ressourcen des Objekts freigibt, wenn das Objekt aus dem Gültigkeitsbereich entfernt wird. Wird von der using
Deklaration verwendet.
Symbol.hasInstance
Eine Methode, die bestimmt, ob ein Konstruktorobjekt ein Objekt als seine Instanz erkennt. Wird von instanceof
verwendet.
Symbol.isConcatSpreadable
Ein Boolean-Wert, der angibt, ob ein Objekt auf seine Array-Elemente abgeflacht werden soll. Wird von Array.prototype.concat()
verwendet.
Symbol.iterator
Eine Methode, die den Standard-Iterator für ein Objekt zurückgibt. Wird von for...of
verwendet.
Symbol.match
Eine Methode, die gegen einen String abgleicht, auch um festzustellen, ob ein Objekt als regulärer Ausdruck verwendet werden kann. Wird von String.prototype.match()
verwendet.
Symbol.matchAll
Eine Methode, die einen Iterator zurückgibt, der Ãbereinstimmungen des regulären Ausdrucks gegen einen String liefert. Wird von String.prototype.matchAll()
verwendet.
Symbol.replace
Eine Methode, die übereinstimmende Teilstrings eines Strings ersetzt. Wird von String.prototype.replace()
verwendet.
Symbol.search
Eine Methode, die den Index innerhalb eines Strings zurückgibt, der dem regulären Ausdruck entspricht. Wird von String.prototype.search()
verwendet.
Symbol.species
Eine Konstruktorfunktion, die verwendet wird, um abgeleitete Objekte zu erstellen.
Symbol.split
Eine Methode, die einen String an den Indizes aufteilt, die einem regulären Ausdruck entsprechen. Wird von String.prototype.split()
verwendet.
Symbol.toPrimitive
Eine Methode, die ein Objekt in einen primitiven Wert umwandelt.
Symbol.toStringTag
Ein String-Wert, der für die Standardbeschreibung eines Objekts verwendet wird. Wird von Object.prototype.toString()
verwendet.
Symbol.unscopables
Ein Objektwert, dessen eigene und geerbte Eigenschaftsnamen von den with
Umgebungsbindungen des zugehörigen Objekts ausgeschlossen sind.
Symbol.for()
Sucht nach bestehenden registrierten Symbolen im globalen Symbolregister mit dem gegebenen key
und gibt es zurück, wenn gefunden. Andernfalls wird ein neues Symbol erstellt und mit key
registriert.
Symbol.keyFor()
Ruft einen gemeinsamen Symbolschlüssel aus dem globalen Symbolregister für das gegebene Symbol ab.
Diese Eigenschaften sind auf Symbol.prototype
definiert und werden von allen Symbol
Instanzen geteilt.
Symbol.prototype.constructor
Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für Symbol
Instanzen ist der Anfangswert der Symbol
Konstruktor.
Symbol.prototype.description
Ein schreibgeschützter String, der die Beschreibung des Symbols enthält.
Symbol.prototype[Symbol.toStringTag]
Der Anfangswert der [Symbol.toStringTag]
Eigenschaft ist der String "Symbol"
. Diese Eigenschaft wird in Object.prototype.toString()
verwendet. Da Symbol
jedoch auch seine eigene toString()
Methode hat, wird diese Eigenschaft nicht verwendet, es sei denn, Sie rufen Object.prototype.toString.call()
mit einem Symbol als thisArg
auf.
Symbol.prototype.toString()
Gibt einen String zurück, der die Beschreibung des Symbols enthält. Ãberschreibt die Object.prototype.toString()
Methode.
Symbol.prototype.valueOf()
Gibt das Symbol zurück. Ãberschreibt die Object.prototype.valueOf()
Methode.
Symbol.prototype[Symbol.toPrimitive]()
Gibt das Symbol zurück.
Der typeof
Operator kann Ihnen helfen, Symbole zu identifizieren.
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
Typumwandlungen mit Symbolen
Einige Dinge, die bei der Arbeit mit Typumwandlungen von Symbolen zu beachten sind.
TypeError
ausgelöst (z.B. +sym
oder sym | 0
).Object(sym) == sym
true
zurück.Symbol("foo") + "bar"
wirft einen TypeError
(kann Symbol nicht in String umwandeln). Dies verhindert, dass Sie stillschweigend einen neuen String-Eigenschaftsnamen aus einem Symbol erstellen, zum Beispiel.String(sym)
Umwandlung funktioniert wie ein Aufruf von Symbol.prototype.toString()
mit Symbolen, aber beachten Sie, dass new String(sym)
einen Fehler auslöst.Symbole sind in for...in
Iterationen nicht auflistbar. Darüber hinaus gibt Object.getOwnPropertyNames()
keine Symbol-Objekteigenschaften zurück, jedoch können Sie Object.getOwnPropertySymbols()
verwenden, um diese zu erhalten.
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"
Symbole und JSON.stringify()
Symbol-gekennzeichnete Eigenschaften werden bei der Verwendung von JSON.stringify()
vollständig ignoriert:
JSON.stringify({ [Symbol("foo")]: "foo" });
// '{}'
Für weitere Details siehe JSON.stringify()
.
Wenn ein Symbol-Wrapper-Objekt als Eigenschaftsschlüssel verwendet wird, wird dieses Objekt in sein umschlossenes Symbol umgewandelt:
const sym = Symbol("foo");
const obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
Spezifikationen Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4