ES2015 führt einige Sprachmerkmale ein, die Entwickler seit langem erwartet haben, aber auch einige wenig bekannte Merkmale, die nicht offensichtlich waren, wie zum Beispiel das Symbol.
Symbol ist ein neuer primitiver Datentyp, ein eindeutiges Tag, das garantiert nicht mit anderen Symbolen in Konflikt steht. In diesem Sinne können Sie sich Symbol als eine Art Uuid vorstellen (eine universelle eindeutige Kennung). Mal sehen, wie Symbol funktioniert und was wir damit machen können.
Schlüsselpunkte
Erstellen Sie ein neues Symbol
Ein neues Symbol erstellen ist sehr einfach. Rufen Sie einfach die Symbolfunktion auf. Beachten Sie, dass dies nur eine Standardfunktion ist, kein Objektkonstruktor. Der Versuch, es mit dem neuen Bediener anzurufen, führt zu einem Typeerror. Jedes Mal, wenn Sie die Symbolfunktion aufrufen, erhalten Sie einen neuen und völlig eindeutigen Wert.
const foo = Symbol(); const bar = Symbol(); foo === bar // false
Sie können auch ein markiertes Symbol erstellen, indem Sie eine Zeichenfolge als erster Parameter übergeben. Ein Tag wirkt sich nicht auf den Wert des Symbols aus, ist jedoch zum Debuggen nützlich, und das Tag wird angezeigt, wenn die Symbolmethode toString () aufgerufen wird. Mehrere Symbole können mit denselben Tags erstellt werden, aber dies hat keinen Vorteil, was zu Verwirrung führen kann.
let foo = Symbol('baz'); let bar = Symbol('baz'); foo === bar // false // console.log(foo); // Symbol(baz)
Zweck des Symbols
Symbol ist ein guter Ersatz für Zeichenfolgen oder Ganzzahlen als Klassen-/Modulkonstanten:
class Application { constructor(mode) { switch (mode) { case Application.DEV: // 设置开发环境的应用程序 break; case Application.PROD: // 设置生产环境的应用程序 break; default: throw new Error('无效的应用程序模式:' + mode); } } } Application.DEV = Symbol('dev'); Application.PROD = Symbol('prod'); // 使用示例 const app = new Application(Application.DEV);
Zeichenfolgen und Ganzzahlen sind keine eindeutigen Werte. Durch die Verwendung von Symbol können wir in den bereitgestellten Werten sicherer sein.
Eine weitere interessante Verwendung von Symbol ist als Objektattributschlüssel. Wenn Sie JavaScript -Objekte jemals als Hash -Karte verwendet haben (Association Arrays in PHP -Begriffen und Wörterbücher in Python -Begriffen), sind Sie mit der Verwendung von Square -Bracket -Notation vertraut, um Eigenschaften zu erhalten/festzulegen:
const foo = Symbol(); const bar = Symbol(); foo === bar // false
Verwenden Sie die Quadratklasse -Notation. Wir können auch Symbol als Attributschlüssel verwenden. Dies gibt mehrere Vorteile. Erstens können Sie sicher sein, dass symbolbasierte Schlüssel niemals Konflikte im Gegensatz zu String-Tasten, die mit vorhandenen Eigenschaften oder Methoden des Objekts in Konflikt stehen. Zweitens werden sie in der für ... in Schleife nicht aufgezählt und von Funktionen wie Object.Keys (), Object.getownPropertynames () und JSON.Stringify () ignoriert. Dies macht sie ideal für Eigenschaften, die Sie bei der Serialisierung von Objekten nicht einbeziehen möchten.
let foo = Symbol('baz'); let bar = Symbol('baz'); foo === bar // false // console.log(foo); // Symbol(baz)
Es ist jedoch erwähnenswert, dass die Verwendung von Symbol als Schlüssel nicht die Privatsphäre garantiert. Es stehen neue Tools zur Verfügung, mit denen Sie auf symbolbasierte Eigenschaftsschlüssel zugreifen können. Object.GetownPropertysymbols () gibt ein Array von symbolbasierten Schlüssel zurück, während reflect.ownkeys () ein Array aller Schlüssel zurückgibt, einschließlich Symbol.
class Application { constructor(mode) { switch (mode) { case Application.DEV: // 设置开发环境的应用程序 break; case Application.PROD: // 设置生产环境的应用程序 break; default: throw new Error('无效的应用程序模式:' + mode); } } } Application.DEV = Symbol('dev'); Application.PROD = Symbol('prod'); // 使用示例 const app = new Application(Application.DEV);
öffentliches Symbol
Symbolschlüsseleigenschaften sind vor ES6 tatsächlich unsichtbar. Sie sind ideal, um vorhandenen JavaScript -Arten neue Funktionen hinzuzufügen, ohne die Rückwärtskompatibilität zu brechen. Das sogenannte "öffentliche" Symbol ist eine vordefinierte Eigenschaft der Symbolfunktion, mit der das Verhalten bestimmter Sprachmerkmale angepasst und neue Funktionen wie Iteratoren implementiert werden können.
symbol.iterator ist ein öffentliches Symbol, mit dem ein Objekt eine spezielle Methode zugewiesen wird, die die Iteration ermöglicht:
const data = []; data['name'] = 'Ted Mosby'; data['nickname'] = 'Teddy Westside'; data['city'] = 'New York';
integrierte Typen, Array, TypeDarray, Map und Set haben ein Standardsymbol.Inerator-Methode, die bei Verwendung von Instanzen dieser Typen in einer für ... von Schleifen oder bei Verwendung von Erweiterungsoperatoren aufgerufen wird. Die Browser haben auch begonnen, das Symbol zu verwenden. Die Taste von Iiterator, um die Iterie über DOM -Strukturen (wie Nodelist und HTMLCollection) auf die gleiche Weise zu ermöglichen.
Globale Registrierung
Die-Pezifikation definiert auch eine Laufzeit-Symbol-Registrierung, dh Sie können Symbole in verschiedenen Ausführungskontexten speichern und abrufen, z.
symbol.für (Schlüssel) ruft das Symbol für den angegebenen Schlüssel aus der Registrierung ab. Wenn der Schlüssel kein Symbol existiert, wird ein neues Symbol zurückgegeben. Wie zu erwarten, werden nachfolgende Anrufe an denselben Schlüssel dasselbe Symbol zurückgeben.
symbol.Keyfor (Symbol) ermöglicht es Ihnen, die Schlüssel für ein bestimmtes Symbol abzurufen. Das Aufrufen der Methode mit Symbol, die in der Registrierung nicht existiert
const user = {}; const email = Symbol(); user.name = 'Fred'; user.age = 30; user[email] = 'fred@example.com'; Object.keys(user); // ['name', 'age'] Object.getOwnPropertyNames(user); // ['name', 'age'] JSON.stringify(user); // {"name":"Fred","age":30}
Benutzerfall
In einigen Anwendungsfällen kann die Verwendung von Symbolen Vorteile bieten. Ein im vorheriger Artikel erwähntes Anwendungsfall ist, wenn Sie einem Objekt eine "versteckte" Eigenschaft hinzufügen möchten, die nicht enthalten ist, wenn das Objekt serialisiert ist.Bibliotheksautoren können auch Symbole verwenden, um Client -Objekten sicher Eigenschaften oder Methoden hinzuzufügen, ohne sich Sorgen darüber zu machen, dass vorhandene Schlüssel überschreiben (oder deren Schlüssel werden von einem anderen Code überschrieben). Beispielsweise werden Widget -Komponenten (z. B. Datumsauswahl) häufig mit verschiedenen Optionen initialisiert und müssen irgendwo in einem Zustand gespeichert werden. Es ist nicht ideal, einem DOM -Element -Objekt eine Widget -Instanz zuzuweisen, da die Eigenschaft mit einem anderen Schlüssel in Konflikt steht. Die Verwendung symbolbasierter Schlüssel kann dieses Problem geschickt umgehen und sicherstellen, dass Ihre Widget-Instanz nicht überschrieben wird. Für einen detaillierteren Blick auf den Mozilla Hacks -Blog -Beitrag ES6 in der Tiefe: Symbole.
Browser -Unterstützung
Wenn Sie mit Symbol experimentieren möchten, ist die Unterstützung für Mainstream -Browser ziemlich gut. Wie Sie sehen können, unterstützen aktuelle Versionen von Chrome, Firefox, Microsoft Edge und Opera den Symboltyp nativ sowie Android 5.1 und iOS 9 auf mobilen Geräten. Wenn Sie ältere Browser unterstützen müssen, können Sie auch Polyfill verwenden.
Schlussfolgerung
Während der Hauptgrund für die Einführung des Symbols darin besteht, das Hinzufügen neuer Funktionen in die Sprache zu erleichtern, ohne vorhandenen Code zu brechen, haben sie einige interessante Verwendungen. Alle Entwickler sollten zumindest ein grundlegendes Verständnis von ihnen haben und mit den am häufigsten verwendeten öffentlichen Symbolen und ihrer Verwendung vertraut sein.
FAQs über ES6 -Symbol
ES6 -Symbol ist ein neuer primitiver Datentyp, der in ES6 (ECMAScript 6) eingeführt wird. Sie sind eindeutige und unveränderliche Datentypen, die als Kennungen für Objekteigenschaften verwendet werden können. Sie können verwendet werden, um private Eigenschaften für Objekte zu erstellen, Programmierkonzepte auf Metaebene zu implementieren und Konflikte zu vermeiden. Sie können auch verwendet werden, um benutzerdefiniertes iteratives Verhalten für Objekte zu definieren.
Sie können die Funktion Symbol () verwenden, um ein neues Symbol zu erstellen. Diese Funktion gibt jedes Mal ein einzigartiges Symbol zurück, wenn es aufgerufen wird, auch wenn Sie das gleiche Argument an dieses übergeben. Zum Beispiel sind let symbol1 = Symbol('symbol'); let symbol2 = Symbol('symbol');
hier, Symbol1 und Symbol2, unterschiedliche Symbole, auch wenn derselbe Parameter "Symbol" an die Funktion Symbol () übergeben wird.
Sie können Symbol in quadratischen Klammern als Objektschlüssel verwenden. Zum Beispiel wird let symbol = Symbol('key'); let obj = {}; obj[symbol] = 'value';
hier ein Symbol "Symbol" als Schlüssel in Objekt "obj" verwendet.
Die globale Symbolregistrierung ist eine gemeinsame Umgebung, in der Sie Symbole für verschiedene Bereiche wie IFRames oder Service -Mitarbeiter erstellen, zugreifen und teilen können. Sie können ein Symbol in der globalen Registrierung mit Symbol.FOR (Schlüssel) erstellen und mit Symbol.Keyfor (Symbol) auf darauf zugreifen.
Sie können Symbol mit Objekten verwenden, um eindeutige Schlüssel zu erstellen. Dies ist nützlich, um Konflikte zu vermeiden, da Symbol immer einzigartig ist. Zum Beispiel wird let symbol = Symbol('key'); let obj = { [symbol]: 'value' };
hier ein Symbol "Symbol" als Schlüssel in Objekt "obj" verwendet.
Ja, Sie können Symbol in eine Zeichenfolge konvertieren, indem Sie die Methode toString () darauf aufrufen. Dies gibt eine Zeichenfolge im Format "Symbol (Beschreibung)" zurück, in der "Beschreibung" eine optionale Beschreibung ist, die Sie an die Funktion Symbol () übergeben.
Ja, Sie können Symbol mit Arrays verwenden. Beispielsweise können Sie Symbol als eindeutige Attributschlüssel verwenden, um Metadaten über ein Array zu speichern. Das Symbol ist jedoch nicht in der Länge Eigenschaft des Arrays enthalten, und die meisten Array -Methoden geben sie nicht zurück.
Ja, Sie können Symbol mit Funktionen verwenden. Beispielsweise können Sie Symbol als eindeutige Attributschlüssel verwenden, um Metadaten über eine Funktion zu speichern. Das Symbol ist jedoch nicht in der Länge der Funktion der Funktion enthalten, und die meisten Funktionsmethoden geben sie nicht zurück.
Ja, Sie können Symbol mit Klassen verwenden. Beispielsweise können Sie Symbol als eindeutige Attributschlüssel verwenden, um Metadaten über eine Klasse zu speichern. Das Symbol ist jedoch nicht in der Länge der Klasse der Klasse enthalten, und die meisten Klassenmethoden geben sie nicht zurück.
Ja, Sie können Symbol mit Zeichenfolgen verwenden. Beispielsweise können Sie Symbol als eindeutige Attributschlüssel verwenden, um Metadaten über eine Zeichenfolge zu speichern. Das Symbol ist jedoch nicht in der Länge der Zeichenfolge enthalten, und die meisten String -Methoden geben sie nicht zurück.
Das obige ist der detaillierte Inhalt vonES6 in Aktion: Symbole und ihre Verwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!