Symbol() a instrukcja switch, o co z tym chodzi?

0

Udało mi się znaleźć parę przykładów w necie, wszystkie są takie same. Nie potrafię zrozumieć jak to ma działać, bo opis do tego jest tak marny, że szkoda gadać.

const COLOR_RED    = Symbol();
const COLOR_ORANGE = Symbol();
const COLOR_YELLOW = Symbol();
const COLOR_GREEN  = Symbol();
const COLOR_BLUE   = Symbol();
const COLOR_VIOLET = Symbol();

function getComplement(color) {
    switch (color) {
        case COLOR_RED:
            return COLOR_GREEN;
        case COLOR_ORANGE:
            return COLOR_BLUE;
        case COLOR_YELLOW:
            return COLOR_VIOLET;
        case COLOR_GREEN:
            return COLOR_GREEN;
        case COLOR_BLUE:
            return COLOR_ORANGE;
        case COLOR_VIOLET:
            return COLOR_YELLOW;
        default: console.log('Error');
    }
}
0
PanKrakers napisał(a):

Udało mi się znaleźć parę przykładów w necie, wszystkie są takie same. Nie potrafię zrozumieć jak to ma działać, bo opis do tego jest tak marny, że szkoda gadać.

Nie rozumiem: jak "co" ma działać?

5

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.

Symbol() !== Symbol();

Mało tego, nawet jak go nazwiesz, to dalej będzie inny:

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.

const COLOR_RED    = 'red';
const COLOR_ORANGE = 'orange';

albo

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:

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:

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1