Symbol

Symbole są względnie nowe w ES6. Element podstawowa symboli reprezentuje unikalną wartość, która nigdy nie koliduje z żadną inną wartością, łącznie z innymi prymitywami symboli. Dwa podstawowe ciągi znaków zawierające identyczne znaki są uznawane za ściśle równa się:

String() === String()
> true

String( "My string." ) === String( "My string." );
> true

Jednak nigdy nie można użyć dwóch symboli utworzonych przy użyciu funkcji Symbol() ściśle równa:

Symbol() === Symbol()
> false

Ta cecha pozwala używać symboli jako unikalnych kluczy właściwości w obiekcie, co zapobiega z kluczami, które mogły zostać dodane do tego obiektu przez inny kod.

const mySymbol = Symbol( "Desc" );

const myObject = {

}

myObject
> Object { Symbol("Desc"): "propSymbol" }

Istnieją 3 typy symboli:

  • Symbole utworzone za pomocą: Symbol()
  • Udostępnione symbole, które są ustawiane i pobierane z globalnego rejestru symboli za pomocą Symbol.for()
  • „Dobrze znane symbole” zdefiniowane jako statyczne właściwości obiektu Symbol. Te symbole zawierają metody wewnętrzne, których nie można przypadkowo zastąpić.

Funkcja Symbol() akceptuje opis (lub „nazwę symbolu”) jako opcjonalny argument. Opisy te są zrozumiałymi dla człowieka etykietami do celów debugowania. nie wpływają na unikalność wyniku. Każde wywołanie Symbol zwraca błąd jest całkowicie niepowtarzalny, nawet jeśli wiele wywołań jest identycznych. opisy:

Symbol( "My symbol." ) === Symbol( "My symbol." );
> false

Podobnie jak w przypadku innych podstawowych typów danych, symbole dziedziczą metody i właściwości z: ich prototypu. Możesz na przykład uzyskać dostęp do opisu jako właściwości dziedziczonej utworzonego symbolu:

let mySymbol = Symbol( "My symbol." );

mySymbol.description
> "My symbol."

Nie możesz jednak utworzyć symbolu za pomocą słowa kluczowego new:

let mySymbol = new Symbol();

> Uncaught TypeError: Symbol is not a constructor

Symbolów nie można wyliczyć, co oznacza, że właściwości symboliczne są niedostępne przy użyciu standardowych metod ich iteracji. getOwnPropertySymbols() daje dostęp do właściwości symboli obiektu.

Wspólne symbole

Metoda Symbol.for() próbuje wyszukać wszystkie istniejące symbole w globalny rejestr symboli dostępny w całym środowisku wykonawczym z danym ciągiem znaków jako kluczem i zwraca symbolu dopasowania, jeśli zostanie on znaleziony. Jeśli go nie znajdzie, zostanie utworzony symbol. o określonym kluczu i dodaje go do rejestru globalnego:

let sharedSymbol = Symbol.for( "My key." );

sharedSymbol === Symbol.for( "My key." )
> true

Funkcjonalność tych klawiszy nie pokrywa się z opisami przypisanymi do utworzonych przez autora elementów podstawowych Symbol. Aby uzyskać dostęp do symbolu w rejestrze symboli, musisz go najpierw utworzyć przy użyciu for():

Symbol( "String" ) === Symbol( "String" );
> false

Symbol( "String" ) === Symbol().for( "String" );
> false

Symbol().for( "String" ) === Symbol().for( "String" );
> true

Aby pobrać klucz dowolnego symbolu z rejestru symboli, użyj funkcji Symbol.keyFor():

let mySymbol = Symbol.for( "Key." );

Symbol.keyFor( mySymbol ) ;
> "Key."

„Dobrze znane” symbole

Znane symbole to właściwości statyczne obiektu Symbol, z których każda jest symbolem. Znane symbole dostarczają unikalne klucze właściwości dla dostęp do wbudowanych metod JavaScript oraz modyfikowanie ich przy jednoczesnej zachowanie przed przypadkowym zastąpieniem.

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 ()

Symbole są cechą charakterystyczną dla ES6, więc te wartości symboliczne są który ma być używany jako „punkty rozszerzenia” dla programistów modyfikujących kod JavaScript działania aplikacji bez wprowadzania problemów ze zgodnością wsteczną.

Znane wartości symboli są często stylizowane za pomocą @@ lub zawinięte w: % do odróżniać klucze od ich zmiennych prototypów. Na przykład: @@match (lub %match%) jest odwołaniem do stałego elementu Symbol.match, a nie String.prototype.match

Sprawdź swoją wiedzę

Czy możesz użyć symbolu new, aby utworzyć symbol?

Nie
Tak

Które z tych stwierdzeń opisują „dobrze znane” symbole?

Właściwości statyczne obiektu „Symbol”
Symbole, których często używasz
Unikalne klucze właściwości służące do otwierania i modyfikowania kodu JavaScript metody wbudowane