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?
Które z tych stwierdzeń opisują „dobrze znane” symbole?