Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Symbol

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

Symbol

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨September 2015⁩.

* Some parts of this feature may have varying levels of support.

Symbol ist ein eingebautes Objekt, dessen Konstruktor einensymbolprimitiven Wert zurückgibt – auch alsSymbolwert oder einfachSymbol 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 schwachenKapselung oder eine schwache Form vonInformationsverbergung.

Jeder Aufruf vonSymbol() garantiert die Rückgabe eines eindeutigen Symbols. Jeder Aufruf vonSymbol.for("key") gibt immer das gleiche Symbol für einen bestimmten Wert von"key" zurück. WennSymbol.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.

Beschreibung

Um ein neues primitives Symbol zu erstellen, schreiben SieSymbol() mit einem optionalen String als Beschreibung:

js
const sym1 = Symbol();const sym2 = Symbol("foo");const sym3 = Symbol("foo");

Der obige Code erstellt drei neue Symbole. Beachten Sie, dassSymbol("foo") den String"foo" nicht in ein Symbol umwandelt. Es erstellt jedes Mal ein neues Symbol:

js
Symbol("foo") === Symbol("foo"); // false

Die folgende Syntax mit demnew Operator wirft einenTypeError:

js
const sym = new Symbol(); // TypeError

Dies verhindert, dass Autoren ein explizitesSymbol 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 Beispielnew Boolean,new String undnew Number).

Wenn Sie wirklich einSymbol Wrapper-Objekt erstellen möchten, können Sie dieObject() Funktion verwenden:

js
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 inWeakMap,WeakSet,WeakRef, undFinalizationRegistry Objekten gespeichert werden.

Geteilte Symbole im globalen Symbolregister

Die obige Syntax mit derSymbol() 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 MethodenSymbol.for() undSymbol.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 diefor() undkeyFor() Methoden.

Die MethodeSymbol.for(tokenString) nimmt einen String-Schlüssel und gibt einen Symbolwert aus dem Register zurück, währendSymbol.keyFor(symbolValue) einen Symbolwert nimmt und den entsprechenden String-Schlüssel zurückgibt. Jeder von ihnen ist das Inverse des anderen, sodass das Folgendetrue ist:

js
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 inWeakMap,WeakSet,WeakRef, undFinalizationRegistry Objekten nicht erlaubt.

Bekannte Symbole

Alle statischen Eigenschaften desSymbol Konstruktors sind selbst Symbole, deren Werte in allen Realms konstant sind. Sie sind alsbekannte 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 mitSymbol.hasInstance als Namen hat, kodiert diese Methode ihr Verhalten mit deminstanceof Operator.

Vor bekannten Symbolen verwendete JavaScript normale Eigenschaften, um bestimmte eingebaute Operationen zu implementieren. Zum Beispiel wird dieJSON.stringify Funktion versuchen, dietoJSON() Methode jedes Objekts aufzurufen, und dieString Funktion wird dietoString() undvalueOf() 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 wurdeSymbol.hasInstance als@@hasInstance geschrieben, und dieArray.prototype[Symbol.iterator]() Methode würdeArray.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 wieArray.prototype, daher sind sie auch inWeakMap,WeakSet,WeakRef, undFinalizationRegistry Objekten erlaubt.

Finden von Symboleigenschaften auf Objekten

Die MethodeObject.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.

Konstruktor

Symbol()

Gibt primitive Werte vom Typ Symbol zurück. Wirft einen Fehler, wenn mitnew aufgerufen.

Statische Eigenschaften

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 derawait using Deklaration verwendet.

Symbol.asyncIterator

Eine Methode, die den Standard-AsyncIterator für ein Objekt zurückgibt. Wird vonfor await...of verwendet.

Symbol.dispose

Eine Methode, die Ressourcen des Objekts freigibt, wenn das Objekt aus dem Gültigkeitsbereich entfernt wird. Wird von derusing Deklaration verwendet.

Symbol.hasInstance

Eine Methode, die bestimmt, ob ein Konstruktorobjekt ein Objekt als seine Instanz erkennt. Wird voninstanceof verwendet.

Symbol.isConcatSpreadable

Ein Boolean-Wert, der angibt, ob ein Objekt auf seine Array-Elemente abgeflacht werden soll. Wird vonArray.prototype.concat() verwendet.

Symbol.iterator

Eine Methode, die den Standard-Iterator für ein Objekt zurückgibt. Wird vonfor...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 vonString.prototype.match() verwendet.

Symbol.matchAll

Eine Methode, die einen Iterator zurückgibt, der Übereinstimmungen des regulären Ausdrucks gegen einen String liefert. Wird vonString.prototype.matchAll() verwendet.

Symbol.replace

Eine Methode, die übereinstimmende Teilstrings eines Strings ersetzt. Wird vonString.prototype.replace() verwendet.

Symbol.search

Eine Methode, die den Index innerhalb eines Strings zurückgibt, der dem regulären Ausdruck entspricht. Wird vonString.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 vonString.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 vonObject.prototype.toString() verwendet.

Symbol.unscopables

Ein Objektwert, dessen eigene und geerbte Eigenschaftsnamen von denwith Umgebungsbindungen des zugehörigen Objekts ausgeschlossen sind.

Statische Methoden

Symbol.for()

Sucht nach bestehenden registrierten Symbolen im globalen Symbolregister mit dem gegebenenkey und gibt es zurück, wenn gefunden. Andernfalls wird ein neues Symbol erstellt und mitkey registriert.

Symbol.keyFor()

Ruft einen gemeinsamen Symbolschlüssel aus dem globalen Symbolregister für das gegebene Symbol ab.

Instanz-Eigenschaften

Diese Eigenschaften sind aufSymbol.prototype definiert und werden von allenSymbol Instanzen geteilt.

Symbol.prototype.constructor

Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. FürSymbol Instanzen ist der Anfangswert derSymbol 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 inObject.prototype.toString() verwendet. DaSymbol jedoch auch seine eigenetoString() Methode hat, wird diese Eigenschaft nicht verwendet, es sei denn, Sie rufenObject.prototype.toString.call() mit einem Symbol alsthisArg auf.

Instanz-Methoden

Symbol.prototype.toString()

Gibt einen String zurück, der die Beschreibung des Symbols enthält. Überschreibt dieObject.prototype.toString() Methode.

Symbol.prototype.valueOf()

Gibt das Symbol zurück. Überschreibt dieObject.prototype.valueOf() Methode.

Symbol.prototype[Symbol.toPrimitive]()

Gibt das Symbol zurück.

Beispiele

Verwendung des typeof Operators mit Symbolen

Dertypeof Operator kann Ihnen helfen, Symbole zu identifizieren.

js
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.

  • Wenn versucht wird, ein Symbol in eine Zahl umzuwandeln, wird einTypeError ausgelöst(z.B.+sym odersym | 0).
  • Bei Verwendung der losen Gleichheit gibtObject(sym) == symtrue zurück.
  • Symbol("foo") + "bar" wirft einenTypeError (kann Symbol nicht in String umwandeln). Dies verhindert, dass Sie stillschweigend einen neuen String-Eigenschaftsnamen aus einem Symbol erstellen, zum Beispiel.
  • Die"sichere"String(sym) Umwandlung funktioniert wie ein Aufruf vonSymbol.prototype.toString() mit Symbolen, aber beachten Sie, dassnew String(sym) einen Fehler auslöst.

Symbole und for...in Iteration

Symbole sind infor...in Iterationen nicht auflistbar. Darüber hinaus gibtObject.getOwnPropertyNames() keine Symbol-Objekteigenschaften zurück, jedoch können SieObject.getOwnPropertySymbols() verwenden, um diese zu erhalten.

js
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 vonJSON.stringify() vollständig ignoriert:

js
JSON.stringify({ [Symbol("foo")]: "foo" });// '{}'

Für weitere Details sieheJSON.stringify().

Symbol-Wrapper-Objekte als Eigenschaftsschlüssel

Wenn ein Symbol-Wrapper-Objekt als Eigenschaftsschlüssel verwendet wird, wird dieses Objekt in sein umschlossenes Symbol umgewandelt:

js
const sym = Symbol("foo");const obj = { [sym]: 1 };obj[sym]; // 1obj[Object(sym)]; // still 1

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-symbol-objects

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp