JavaScript/Objekte/Symbol

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die eingebaute Funktion Symbol ermöglicht es, Symbole zu erzeugen. Dabei handelt es sich um spezielle primitive Werte von JavaScript, die einen nicht weiter bekannten, aber dafür garantiert eindeutigen Wert haben. Symbole können als eine Art „anonymer Name“ für Objekteigenschaften verwendet werden.

Um den Einsatzzweck eines Symbols zu beschreiben, kann der Symbol-Funktion eine Zeichenkette übergeben werden, die zusammen mit dem Symbol gespeichert wird.

Außerdem verfügt JavaScript über eine globale Symbol-Registry, in der man Symbole unter einem beliebigen Namen ablegen kann. Das Auflisten aller Symbole in dieser Registry ist nicht möglich, eine Prüfung, ob unter einem bestimmten Namen ein Symbol zu finden ist, ebenfalls nicht. Der Zweck dieser Registry ist, mit Hilfe von Symbol.for(name) einem Namen eindeutig ein Symbol zuordnen zu können, und zwar übergreifend über alle JavaScript-Realms.

Darüber hinaus sind als Eigenschaften des Funktionsobjektes einige Konstanten hinterlegt, sogenannte Well-Known Symbols. Es gibt etliche Stellen in JavaScript, wo das Vorhandensein einer Eigenschaft oder Methode, die ein well-known Symbol als Name verwendet, das Verhalten von JavaScript beeinflusst.


Syntax

Symbol([description])


Attribute
Writable false
Enumerable false
Configurable true


Erstellen eines Symbols

Um ein neues Symbol zu erzeugen, rufen Sie einfach Symbol als Funktion auf. Obwohl die Funktion als Konstruktorfunktion in der Spezifikation steht, ist der Aufruf mit new Symbol nicht möglich, das löst einen TypeError aus[1].

Erzeugen von Symbolen
const wiki = Symbol();
const self = Symbol("selfhtml");

console.log(wiki, self);
// Ausgabe: Symbol() Symbol(selfhtml)

Verwendung

Symbole und Typkonvertierung

Symbol.prototype überschreibt die toString()-Methode von Object.prototype und stellt das Symbol als "Symbol(description)". Das bedeutet aber nicht, dass Symbole automatisch in Zahlen oder Zeichenketten konvertiert werden, wenn sie mit diesen gemeinsam in einem Ausdruck verwendet werden. Sowohl "self" + Symbol("html") als auch 12 + Symbol("13") werden einen TypeError mit der Meldung, dass ein Symbol nicht in string oder number konvertiert werden könne[2].

„Geheime“ Eigenschaften

Sie können Symbole als Name einer Eigenschaft oder einer Methode in einem Objekt verwenden. Auf diese Eigenschaft oder Methode kann nur zugegriffen werden, wenn man über das Symbol verfügt.

Symbol als Eigenschaftsname
const sym = Symbol("geheim");
const someObject = {
   text: 'Dies ist ein Objekt',
   [sym]: 42
};

Mit Hilfe der eckigen Klammern um einen Schlüssel in einem Objektliteral kann eine Eigenschaft erzeugt werden, deren Namen aus einer Variablen entnommen wird. Im Beispiel ist es das „geheime“ Symbol.

Tatsächlich ist es mit dem Geheimnis aber nicht allzuweit her, denn über die getOwnPropertySymbols()-Methode des Object-Konstruktors lassen sich die in einem Objekt verwendeten Symbole herausfinden.

Der Vorteil von Eigenschaften, die über ein Symbol angesprochen werden, liegt darin, dass sie von Methoden wie getOwnPropertyNames() oder keys() und von der For...in-Schleife nicht erfasst werden. Die stringify()-Methode des JSON-Objekts beachtet sie ebenfalls nicht. Damit bieten Symbole die Möglichkeit, einem Objekt technische „Hintergrundeigenschaften“ zuzuweisen, die von den normalen fachlichen Eigenschaften getrennt sind.

„Magische“ Eigenschaften

Durch die well-known Symbole wird die Möglichkeit, im Hintergrund spezielle Eigenschaften zuzuweisen, von der JavaScript-Laufzeitumgebung eingesetzt. In der JavaScript-Spezifikation sind diese Symbole durch einen Namen gekennzeichnet, der mit @@ beginnt. Der gleiche Name, nur ohne das @@-Präfix, bezeichnet auch die Eigenschaft des Symbol-Objekts, über die dieses Symbol verfügbar ist.

Beispiel: Das Symbol @@iterator können Sie mittels Symbol.iterator abrufen.

@@iterator
Ein Objekt, das die Eigenschaft @@iterator besitzt, implementiert das iterable-Protokoll. In der Eigenschaft muss der Iterator für dieses Objekt zu finden sein.
@@split
Ein Objekt, das eine Methode mit diesem Namen implementiert, dient als Separator für die split()-Methode von Zeichenketten. @@split wird von beispielsweise von RegExp-Objekten implementiert.
@@toPrimitive
Mit diesem Symbol kann eine Methode bereitgestellt werden, die von der JavaScript-Laufzeitumgebung aufgerufen wird, wenn ein Objekt in einen primitiven Typ konvertiert werden muss.

ToDo (weitere ToDos)

Pro well-known eine Subpage erstellen mit genauerer Beschreibung der Verwendung. In einer dl geht das nicht. Rolf b (Diskussion) 00:05, 2. Apr. 2023 (CEST)

Weblinks

  1. ECMA 262: The Symbol Constructor
  2. ECMA 262: Spezifikation der abstrakten Operation ToString()