
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.hasInstanceSymbol.iteratorSymbol.toPrimitiveSie 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 SymbolSymbol 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. .