Symbole to takie jakby unikalne wartości. Przez wartości mam na myśli wartość abstrakcyjną (to nie jest ani obiekt, ani liczba, ani string, tylko po prostu taki jakby "symbol"). Każdy symbol jest inny, tj.
Kopiuj
Symbol() !== Symbol();
Mało tego, nawet jak go nazwiesz, to dalej będzie inny:
Kopiuj
Symbol('foo') !== Symbol('foo');
Dlatego w tym przykładzie użyto symboli do odróżniania kolorów. Nie używając symboli, podobny efekt można by osiągnąć przypisując do stałych jakieś inne unikalne wartości np.
Kopiuj
const COLOR_RED = 'red';
const COLOR_ORANGE = 'orange';
albo
Kopiuj
const COLOR_RED = 0xff0000;
const COLOR_ORANGE = 0xffaa00;
Jednak symbole gwarantują unikalność. Ten przykład jest trochę do bani swoją drogą, bo o ile jest on bardzo prosty i dobrze ilustruje samo działanie symboli, to jednak w tak prostym przykładzie te symbole wcale nie są niezbędne, żeby osiągnąć to samo.
Z mojego doświadczenia symbole przydają się najbardziej wtedy, kiedy chcesz dodać customową właściwość do obiektu, a nie chcesz, żeby nastąpiła kolizja nazw. Wtedy możesz zrobić tak:
Kopiuj
const foo = {};
const key = Symbol(); // tworzymy unikalną wartość
foo[key] = 123; // symbole mogą być kluczami! Jak stringi, ale symbole nie są stringami!
Można też używać symboli jako id:
Kopiuj
const foo = {id: Symbol()};
const bar = {id:Symbol()};
Jeśli chcesz identyfikować obiekty w jakiś sposób (bez symboli mógłbyś trzymać id jako liczbę i trzymać gdzieś numer ostatniego id, i potem powiększać o 1 za każdym nowym obiektem, a tu masz wygodniej).
Tylko taka uwaga - symbole się nie serializują do JSONa (nie bez sztuczek), co będzie mieć znaczenie, jeśli np. będziesz chciał przesłać to id na serwer czy gdzieś indziej zapisać. Wtedy lepiej się sprawdzą liczby czy stringi jako unikalne wartości.