Symbol
ist ein spezieller Typ in JavaScript
. Insbesondere unterscheiden sich alle Symbol
voneinander. Wir können „Symbol“ verwenden, um einen eindeutigen Wert darzustellen. Das Folgende ist ein Beispiel für die Erstellung eines Symbol
:
let id = Symbol();
Auf diese Weise erstellen wir einen Wert vom Typ Symbol
und speichern diesen Wert in der Variablen id
.
Wenn wir eine Variable vom Typ Symbol
erstellen, können wir einige Zeichenfolgen mit Sekundenattributen in den Parametern übergeben, um die Zweckinformationen dieser Variablen zu beschreiben.
Zum Beispiel:
let id1 = Symbol('Die ID von Xiao Ming, der verrückt und cool ist'); let id2 = Symbol('Zurückhaltende, luxuriöse und konnotative Tingting-ID');
Symbol
sind jederzeit unterschiedlich, auch wenn sie die gleichen Beschreibungsinformationen haben, die Beschreibung ist nur eine Bezeichnung und hat keinen anderen Zweck. Zum Beispiel:
let id1 = Symbol('id'); let id2 = Symbol('id'); console.log(id1==id2);//
Die Bedeutung der falschen Bezeichnung hängt meiner Meinung nach damit zusammen, dass Symbol
den internen spezifischen Wert nicht intuitiv erkennen kann, indem wir Beschreibungsinformationen hinzufügen Verständnis für die Verwendung von Variablen.
JavaScript
String-Typ konvertiert, sodass wir seinen Wert nicht intuitiv erkennen können. Beispielsweise können wir die Zahl 123
direkt mit alert(123)
konvertieren In String-Popup konvertieren.
Der Symbol
ist jedoch etwas Besonderes und kann nicht direkt konvertiert werden, zum Beispiel:
let id = Symbol(); warning(id);//Fehlerbericht:
Symbol
in JavaScript
kann aufgrund seines inhärenten „Sprachschutz“-Mechanismus nicht in einen String konvertiert werden, um Sprachverwechslungen zu vermeiden, da dies bei Strings und Symbol
der Fall ist wesentlich anders Es gibt einen Unterschied und das eine sollte nicht in das andere umgewandelt werden.
Stellen Sie sich vor, wenn Symbol
in eine Zeichenfolge konvertiert werden kann, wird es zu einer Funktion, die eine eindeutige Zeichenfolge generiert, und es ist kein unabhängiger Datentyp erforderlich.
Wenn wir den Wert Symbol
Variablen wirklich wissen wollen, können wir die Methode .toString()
wie folgt verwenden:
let id = Symbol('das ist eine Identifikation'); console.log(id.toString());//Symbol(das ist eine Identifikation);
Oder verwenden Sie das .description
Attribut, um die Beschreibungsinformationen abzurufen:
let id = Symbol('Komm schon, gib mir Oli'); console.log(id.description);//Komm schon, Ollie“
Gemäß JavaScript
Spezifikationen können nur zwei Arten von Werten als Objekteigenschaftsschlüssel verwendet werden
:
Andere Typen werden verwendet. Der Schlüssel des Objekts wird im vorherigen Kapitel ausführlich vorgestellt und wird hier nicht wiederholt.
Es gibt zwei Symbol
Beispiel 1:
let id = Symbol('id'); let user = {}; user[id] = 'id value';//Symbolschlüssel hinzufügen console.log(user[id]);//id value
Beispiel 2:
let id = Symbol('id'); let user = { [id]:'id value',//beachten Sie hier die eckigen Klammern }; console.log(user[id]);
Die beiden oben genannten Fälle zeigen die Verwendung Symbol
als Schlüssel in das Objekt. Beachten Sie, dass Sie beim Zugriff auf das Attribut obj[id]
anstelle von obj.id
verwenden müssen obj.id
, weil obj.id
obj['id']
darstellt.
Was passiert, wenn wir Symbol
als Schlüssel des Objekts verwenden?
Symbol
in for...in besteht darin, dass, wenn das Objekt Symbol
als Schlüssel verwendet, mit for…in
-Anweisung nicht auf Symbol
zugegriffen werden kann.
Zum Beispiel:
let id = Symbol('id'); let user = { Name: 'xiaoming', [id]: 'id', }; for (let key in user) console.log(user[key]);
Führen Sie den obigen Code aus und erhalten Sie die folgenden Ergebnisse:
> Xiaoming
kann feststellen, dass der Wert des [id]
-Objekts nicht ausgedruckt wird, was darauf hinweist, dass im Objekt Attributliste, die Verwendung for … in
ignoriert automatisch Schlüssel vom Typ Symbol
.
Ebenso ignoriert Object.keys(user)
alle Schlüssel vom Typ Symbol
.
Diese Funktion kann sehr nützliche Effekte mit sich bringen, zum Beispiel können wir Eigenschaften erstellen, die nur wir verwenden können.
Obwohl wir keine Möglichkeit haben, den Symbol
direkt zu erhalten, kann Object.assign
alle Eigenschaften kopieren:
let id = Symbol(); sei obj = { [id]: '123' } let obj2 = Object.assign({},obj); console.log(obj2[id]);
Dies hat keinen Einfluss auf die versteckten Eigenschaften von Symbol
, da das kopierte Objekt den Symbol
immer noch nicht erhalten kann.
Da Symbol
nicht direkt in eine Zeichenfolge konvertiert werden kann, haben wir keine Möglichkeit, seinen Wert intuitiv zu erhalten, noch können wir das Symbol
Attribut des Objekts über for … in
Mit anderen Worten, ohne Symbol
Variable selbst, Wir haben keine Möglichkeit, die entsprechenden Eigenschaften innerhalb des Objekts abzurufen.
Daher können wir über den Schlüsselwert des Symbol
die Eigenschaften ausblenden. Auf diese Eigenschaften kann nur wir selbst zugreifen, und niemand sonst kann unsere Eigenschaften sehen.
Zum Beispiel:
Während des Entwicklungsprozesses müssen wir mit unserem Kollegen „Zhang San“ zusammenarbeiten, und dieser Zhang San hat ein sehr einfach zu verwendendes Tool
erstellt. Tool
ist ein Objekttyp, Tool
wir kostenlos verwenden möchten und fügen Sie darauf basierend einige Ihrer eigenen Eigenschaften hinzu.
Wir können einen Schlüssel vom Typ Symbol
hinzufügen:
let tool = {//Tool, geschrieben von Zhang San Verwendung: „Kann alles“, } let name = Symbol("Mein Werkzeug obj"); tool[name] = „Das ist mein Werkzeug“; console.log(tool[name]);
Das obige Beispiel zeigt, wie Sie Ihre eigenen Eigenschaften zu einem von anderen geschriebenen Objekt hinzufügen. Warum also Symbol
anstelle einer regulären Zeichenfolge verwenden?
Die Gründe dafür sind wie folgt:
tool
handelt es sich um Code, der von anderen geschrieben wurde. Grundsätzlich sollten wir den Code anderer Personen nicht ändern, da dies zu Risiken beiSymbol
Symbol
niemals zu Konflikten führen, daSymbol
zugreifen können.
Wenn wir den Symbol
nicht verwenden, tritt wahrscheinlich die folgende Situation auf:
let tool = {//Tool geschrieben von Zhang San Verwendung: „Kann alles“, } tool.usage = "Boom Boom"; console.log(tool.usage);
Der obige Code verwendet „usage“ wieder und schreibt somit die ursprünglichen Attribute neu, was dazu führt, dass die ursprüngliche Funktion des Objekts abnormal ist.
Alle Symbol
sind unterschiedlich, auch wenn sie die gleiche Bezeichnung (Beschreibung) haben.
Manchmal möchten wir über einen Zeichenfolgennamen (Label) auf dasselbe Symbol
zugreifen. Beispielsweise greifen wir an verschiedenen Stellen im Code auf dasselbe Symbol
zu.
JavaScript
verwaltet eine globale Symbol
Registrierung. Wir können auf das Objekt zugreifen, indem wir ein Symbol
Objekt in die Registrierung einfügen und dem Objekt einen Zeichenfolgennamen geben.
Um ein Symbol
in die Registrierung einzufügen oder zu lesen, müssen Sie Symbol.for(key)
verwenden. Wenn in der Registrierung ein Objekt mit dem Namen key
vorhanden ist, wird das Objekt zurückgegeben zurückgegeben.
Zum Beispiel:
let id1 = Symbol.for('id');//Es gibt kein Symbol mit dem Namen id in der Registrierung, erstellen und zurückgeben let id2 = Symbol.for('id');//Es gibt bereits ein Symbol mit dem Namen id in der Registrierung Geben Sie für das Symbol mit der ID direkt console.log(id1===id2);//true zurück.
Über Symbol.for(key)
können wir Symbol
als globale Variable verwenden und eine Zeichenfolge verwenden Markieren Sie den Namen des Objekts.
Im Gegenteil, wir können Symbol.keyFor(Symbol)
auch verwenden, um den Namen umgekehrt vom Objekt abzurufen.
Beispiel:
let id = Symbol.for('id');//Es gibt kein Symbol mit dem Namen id in der Registrierung, erstellen und zurückgeben let name = Symbol.keyFor(id); console.log(name);//id
Die Funktion Symbol.keyFor()
kann nur für globale Symbol
verwendet werden (Objekte, die mit Symbol.for
eingefügt wurden). Bei Verwendung für nicht-globale Objekte wird undefined
zurückgegeben.
Zum Beispiel:
let id = Symbol('id');//local Symbol let name = Symbol.keyFor(id); console.log(name);//undefiniertes
JavaScript
hat viele Symbol
, wie zum Beispiel:
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
Sie haben ihre eigenen Verwendungszwecke.
Symbol
Objekts ist eindeutig.Symbol
kann eine Bezeichnung hinzufügen und die Entität des Objekts in der globalen Registrierung abfragen,Symbol
for … in
nicht erkannt werdenSymbol
Das globale Symbol
Symbol
jedoch nicht vollständig verborgen. Wir können alle Symbol
des Objekts über Object.getOwnPropertySymbols(obj)
oder alle Schlüssel des Objekts über Reflect.ownKeys(obj)
abrufen. .