Symbol w JavaScript to unikalny typ danych, używany do tworzenia wyjątkowych identyfikatorów dla właściwości obiektów. Jego główną zaletą jest unikalność – dwa symbole o tej samej nazwie są różne, co zapobiega konfliktom nazw. To sprawia, że Symbol jest idealny do dodawania właściwości do obiektów, zwłaszcza w dużych aplikacjach, gdzie moduły mogą nadpisywać sobie nawzajem właściwości.
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 === id2);// false
Argument przekazywany do funkcji Symbol
jest opcjonalny. Niezależnie od tego, czy argument jest taki sam, czy różny, każde wywołanie Symbol
generuje unikalną wartość. To sprawia, że symbole są idealne do bezpiecznego dodawania niestandardowych identyfikatorów do obiektów z zewnętrznych bibliotek.
Przykład:
let person = { name: "Jon", age: 45, job: "Programer", id: 1 };
// Dodając właściwość z użyciem symbolu
let idPerson = Symbol("id");
person[idPerson] = 23; // nie nadpisuje istniejącego klucza 'id'
W tym przypadku, dzięki wykorzystaniu symbolu, dodajemy nową wartość do obiektu person
bez ryzyka nadpisania istniejącej właściwości id
.
Ukryte właściwości
Symbole w JavaScript mają unikalną cechę, że są „ukryte” – nie są widoczne podczas standardowej iteracji po właściwościach obiektu. Oznacza to, że są one dostępne tylko dla kodu, który je utworzył:
let person = { name: "Jon", age: 45, job: "Programer", id: 1};
let isTerminated = Symbol("isTerminated");
person[isTerminated] = true;
for (let key in person) console.log(key);
/*
Wynik:
name
age
job
id
*/
console.log(Object.keys(person));
// ['name', 'age', 'job', 'id']
W tym przykładzie, isTerminated
jest symbolem dodanym do obiektu person
, ale nie pojawia się on w pętli for..in
ani w wyniku Object.keys(person)
.
Globalne właściwości
Dodatkowo, używając Symbol.for()
, możesz stworzyć symbole, które są globalnie rozpoznawane w całym skrypcie, co pozwala na odwoływanie się do tych samych symboli w różnych częściach kodu:
Symbol.for("id") == Symbol.for("id"); //Wynik true
Symbol("id") == Symbol("id"); // Wynik false
To pokazuje, jak symbole mogą być używane zarówno do tworzenia unikalnych, ukrytych właściwości, jak i do tworzenia globalnych identyfikatorów.