Im Allgemeinen können Objekteigenschaftsschlüssel zwei Typen haben: string und symbol. Symbole sind letztendlich eindeutige Kennzeichner. Sie können durch Verwendung der Factory-Funktion Symbol() erstellt werden.
Zum Beispiel:
javascript symbol
Nachdem ein symbol erstellt wurde, können Sie ihm einen Namen oder eine Beschreibung geben. Dies ist besonders nützlich für Debugging-Praktiken. Lassen Sie uns das folgende Beispiel betrachten:
// id is a symbol, it's a description "id"
let id = Symbol("id");
Wie wir bereits festgestellt haben, sind Symbole eindeutig. Selbst wenn Sie eine Vielzahl von Symbolen mit dem gleichen Namen erstellen, werden sie als unterschiedliche Symbole betrachtet.
Denken Sie daran, dass Beschreibungen und Namen nur Etiketten sind, die nichts beeinflussen.
Hier ist ein Beispiel:
In dem oben genannten Fall haben die beiden Symbole die gleiche Beschreibung, sind aber nicht gleich.
Es ist wichtig zu wissen, dass es nicht möglich ist, Symbole automatisch zu einem String zu konvertieren.
Zum Beispiel wird dieser alert einen Fehler erzeugen:
Um ein Symbol anzuzeigen, müssen Sie explizit .toString() darauf aufrufen, wie folgt:
Um die symbol.description Eigenschaft zu bekommen, rufen Sie:
Über "verborgene" Eigenschaften
Mit Hilfe von Symbolen können Sie ganz einfach die sogenannten "verborgenen" Eigenschaften eines Objekts erstellen. Es ist unmöglich, auf andere Teile des Codes zuzugreifen oder diese zu überschreiben.
Falls Sie mit site Objekten arbeiten, die zu fremdem Code gehören, müssen Sie ihnen Identifikatoren hinzufügen. Dafür ist es notwendig, einen Symbolschlüssel zu verwenden, wie folgt:
In einem anderen Fall möchte ein anderer Skript seinen Identifier innerhalb der site haben.
Es könnte sich um eine weitere JavaScript-Bibliothek handeln, so dass die Skripte sich nicht voneinander bewusst sind.
Also könnte dieses Skript sein eigenes Symbol("id") erstellen.
Zum Beispiel:
// ...
let id = Symbol("id");
site[id] = "Their id value";
Symbole in einem Literal
Um ein Symbol in einem Objektliteral zu verwenden, müssen Sie eckige Klammern um es herum einfügen.
Schauen Sie sich dieses Beispiel an:
Dies liegt daran, dass Sie den Wert aus der Variable benötigen, id als Schlüssel und nicht die Zeichenkette "id".
Die for...in Schleife überspringt Symbole
Die for..in Schleife bezieht keine symbolischen Eigenschaften ein. Hier ist ein Beispiel:
Globale Symbole
Wie wir bereits erwähnt haben, sind Symbole eindeutig, auch wenn sie die gleiche Beschreibung haben. Aber manchmal benötigen Sie Symbole mit demselben Namen, die dieselben Entitäten sein sollen. Zum Beispiel möchten verschiedene Teile Ihrer Anwendung auf das Symbol "id" zugreifen, das die gleiche Eigenschaft bedeutet.
Dafür gibt es ein globales Symbolregister. Es ermöglicht die Erstellung von Symbolen darin und den späteren Zugriff darauf. Außerdem stellt es sicher, dass fortlaufende Zugriffe auf den gleichen Namen genau das gleiche Symbol anzeigen. Um ein Symbol für das globale Register zu lesen, wird empfohlen, Symbol.for(key) zu verwenden.
Dieser Aufruf hilft beim Überprüfen des globalen Registers. Dann, wenn ein Symbol definiert ist als key, wird es zurückgegeben. Andernfalls wird ein neues Symbol Symbol(key) erstellt und im Register unter einem bestimmten key gespeichert.
Das wird im folgenden Beispiel gezeigt:
Die Symbole, die sich im Register befinden, sind als globale Symbole bekannt. Sie können sie verwenden, wenn Sie ein anwendungsweites Symbol möchten, das in jedem Teil des Codes einen Eintrag hat.
Symbol.keyFor
Es ist möglich, einen umgekehrten Aufruf für globale Symbole zu verwenden. Sie können dies mit der Hilfe von Symbol.keyFor(sym) tun. Es wird das Gegenteil tun: einen Namen durch ein globales Symbol zurückgeben.
Für ein besseres Verständnis schauen Sie sich das folgende Beispiel an:
Der Symbol.keyFor funktioniert ausschließlich für globale Symbole. Falls das Symbol sich als nicht global herausstellt, gibt es keine Möglichkeit, es zu finden und undefined zurückzugeben. Mit anderen Worten, jedes Symbol hat eine description Eigenschaft.
Zum Beispiel:
Systemsymbole
Intern verwendet JavaScript eine Vielzahl von Systemsymbolen.
Hier sind einige davon:
- Symbol.hasInstance
- Symbol.iterator
- Symbol.isConcatSpreadable
- Symbol.toPrimitive
Es gibt auch viele andere Systemsymbole.
Zum Beispiel ist Symbol.toPrimitive dafür vorgesehen, die Umwandlung von Objekten in primitive Typen zu beschreiben.
Symbol.isConcatSpreadable kann als ein ziemlich spezifisches Symbol beschrieben werden. Es steuert das Verhalten von Array#concat..
Zusammenfassung
In JavaScript garantieren Symbole einen einzigartigen Zugriffsebene zu Objekten. Alle Entwickler müssen ein grundlegendes Verständnis von Symbolen und ihren Anwendungsfällen haben.
Technisch gesehen sind Symbole nicht völlig verborgen. Eine eingebaute Methode Object.getOwnPropertySymbols(obj) ermöglicht es Ihnen, alle Symbole abzurufen. Es gibt eine weitere Methode, genannt Reflect.ownKeys(obj),, die darauf abzielt, alle Schlüssel eines Objektes, einschließlich der symbolischen, zurückzugeben. Trotzdem vermeiden die meisten Bibliotheken, Syntaxkonstrukte und eingebaute Funktionen die Verwendung der oben genannten Methoden.
Quizzeit: Testen Sie Ihre Fähigkeiten!
Sind Sie bereit, das Gelernte herauszufordern? Tauchen Sie ein in unsere interaktiven Quizze für ein tieferes Verständnis und eine unterhaltsame Art, Ihr Wissen zu festigen.