Symbol

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?

Nein
Ja

Welche der folgenden Aussagen beschreiben „bekannte“ Symbole?

Statische Eigenschaften des Symbol-Objekts
Häufig verwendete Symbole
Eindeutige Eigenschaftsschlüssel für den Zugriff auf und das Ändern von JavaScript- integrierte Methoden