JavaScript Symbol Typen

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:

Javascript symbol type
let mySymbol1 = Symbol("mySymbol"); let mySymbol2 = Symbol("mySymbol"); console.log(mySymbol1 == mySymbol2); // false

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:

Javascript symbol type
let mySymbol = Symbol("mySymbol"); console.log(mySymbol); // TypeError: Cannot convert a Symbol value to a string

Um ein Symbol anzuzeigen, müssen Sie explizit .toString() darauf aufrufen, wie folgt:

javascript symbol type
let mySymbol = Symbol("mySymbol"); console.log(mySymbol.toString()); // Symbol(mySymbol), now it works

Um die symbol.description Eigenschaft zu bekommen, rufen Sie:

Javascript symbol description
let mySymbol = Symbol("mySymbol"); console.log(mySymbol.description); // mySymbol

Ü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:

Javascript symbol key
let site = { // belongs to another code name: "W3Docs" }; let id = Symbol("id"); site[id] = 1; console.log(site[id]); // we can access the data using the symbol as the key

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:

Javascript symbol
let id = Symbol("id"); let site = { name: "W3Docs", [id]: 100 // not "id: 100" }; console.log(site[id]);

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:

Javascript symbol for..in loop
let id = Symbol("id"); let site = { name: "W3Docs", [id]: 10 }; for (let key in site) { console.log(key); // name , no symbols } console.log("Direct: " + site[id]); // works the direct access by the symbol

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:

Javascript symbol.for the global registry
// read from the global registry let id = Symbol.for("id"); // if this the symbol did not exist, it's created // read it again let idAgain = Symbol.for("id") // the same symbol console.log(id === idAgain); // true

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:

Javascript global symbol
// get symbol by name let sym1 = Symbol.for("siteName"); let sym2 = Symbol.for("id"); // get name by symbol console.log(Symbol.keyFor(sym1)); // siteName console.log(Symbol.keyFor(sym2)); // id

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:

Javascript symbol description
let globalSymbol = Symbol.for("name"); let localSymbol = Symbol("name"); console.log(Symbol.keyFor(globalSymbol)); // name, global symbol console.log(Symbol.keyFor(localSymbol)); // undefined, not global console.log(localSymbol.description); // name

Systemsymbole

Intern verwendet JavaScript eine Vielzahl von Systemsymbolen.

Hier sind einige davon:

  1. Symbol.hasInstance
  2. Symbol.iterator
  3. Symbol.isConcatSpreadable
  4. 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.

Finden Sie das nützlich?