Symbole sind eine relativ neue in ES6 eingeführt. Ein Symbolprivileg stellt einen eindeutigen Wert dar, der und kollidiert nie mit anderen Werten, auch nicht mit denen anderer Symbolprimitive. Zwei String-Primitive, die aus identischen Zeichen bestehen, gelten als strengstens gleich:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
Zwei mit der Symbol()
-Funktion erstellte Symbole können jedoch niemals
streng gleich:
Symbol() === Symbol()
> false
Mit dieser Eigenschaft können Sie Symbole als eindeutige Eigenschaftsschlüssel in einem Objekt verwenden und so verhindern, Kollisionen mit Schlüsseln, die durch jeden anderen Code dem Objekt hinzugefügt werden könnten.
const mySymbol = Symbol( "Desc" );
const myObject = {
}
myObject
> Object { Symbol("Desc"): "propSymbol" }
Es gibt drei Arten von Symbolen:
- Mit
Symbol()
erstellte Symbole - Gemeinsame Symbole, die mithilfe von
Symbol.for()
- „Bekannte Symbole“ als statische Eigenschaften des Symbolobjekts definiert. Diese Symbole enthalten interne Methoden, die nicht versehentlich überschrieben werden können.
Symbol()
akzeptiert eine Beschreibung (oder einen "Symbolnamen") als optionales Argument.
Diese Beschreibungen sind für Menschen lesbare Labels, die zu Debugging-Zwecken dienen.
keinen Einfluss auf die Eindeutigkeit des Ergebnisses. Jeder Aufruf von Symbol
gibt den Fehlerwert
eine völlig eindeutige Symbolprivilegierung, auch wenn mehrere Aufrufe identische
Textzeilen:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
Wie bei anderen primitiven Datentypen übernehmen Symbole Methoden und Eigenschaften von ihren Prototyp. Sie können beispielsweise auf eine Beschreibung als übernommene Eigenschaft des erstellten Symbols zugreifen:
let mySymbol = Symbol( "My symbol." );
mySymbol.description
> "My symbol."
Sie können jedoch kein Symbol mit dem Schlüsselwort new
erstellen:
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
Symbole können nicht aufzählbar sein, was bedeutet, dass symbolische Eigenschaften nicht verfügbar sind.
wenn Sie Standardmethoden verwenden,
um sie zu iterieren. Das getOwnPropertySymbols()
gewährt Zugriff auf die Symboleigenschaften eines Objekts.
Freigegebene Symbole
Mit der Methode Symbol.for()
wird versucht, nach vorhandenen Symbolen in einem
laufzeitweite globale Symbol-Registry mit einem bestimmten String als Schlüssel und gibt
das entsprechende Symbol, falls eines gefunden wird. Wenn keines gefunden wird, wird ein Symbol erstellt.
durch den angegebenen Schlüssel und fügt ihn der globalen Registry hinzu:
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
Die Funktionen dieser Schlüssel überschneiden sich nicht mit den Beschreibungen, die den
vom Autor erstellte Symbol
Primitive. So greifen Sie auf ein Symbol in der Symbolregistrierung zu:
müssen Sie sie zuerst mit for()
erstellen:
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol().for( "String" );
> false
Symbol().for( "String" ) === Symbol().for( "String" );
> true
Um den Schlüssel für ein beliebiges Symbol aus der Symbolregistrierung abzurufen, verwenden Sie
Symbol.keyFor()
:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
"Bekannter Ort" Symbole
Bekannte Symbole sind statische Eigenschaften des Symbol
-Objekts, von denen jedes
ist selbst nur ein Symbol. Bekannte Symbole stellen eindeutige Eigenschaftsschlüssel für
auf die integrierten Methoden von JavaScript zugreifen und diese ändern
nicht unbeabsichtigt überschrieben werden.
Symbol;
> function Symbol()
asyncIterator: Symbol(Symbol.asyncIterator)
for: function for()
hasInstance: Symbol("Symbol.hasInstance")
isConcatSpreadable: Symbol("Symbol.isConcatSpreadable")
iterator: Symbol(Symbol.iterator)
keyFor: function keyFor()
length: 0
match: Symbol("Symbol.match")
matchAll: Symbol("Symbol.matchAll")
name: "Symbol"
prototype: Object { … }
replace: Symbol("Symbol.replace")
search: Symbol("Symbol.search")
species: Symbol("Symbol.species")
split: Symbol("Symbol.split")
toPrimitive: Symbol("Symbol.toPrimitive")
toStringTag: Symbol("Symbol.toStringTag")
unscopables: Symbol("Symbol.unscopables")
<prototype>: function ()
Da Symbole eine spezielle Funktion von ES6 sind, werden diese symbolischen Werte die als Erweiterungspunkte für Entwickler, die JavaScripts ohne Abwärtskompatibilitätsprobleme.
Bekannte Symbolwerte werden oft mit einem
@@
-Präfix oder in %
eingeschlossen in
Schlüssel von änderbaren Prototypen unterscheiden. Beispiel: @@match
(oder %match%
) ist ein Verweis auf die unveränderliche Symbol.match
, nicht
String.prototype.match
.
Wissen testen
Können Sie mit new
ein Symbol erstellen?
Welche der folgenden Aussagen beschreiben „bekannte“ Symbole?