Symbol
Typ prymitywny do tworzenia unikalnych identyfikatorów, np. kluczy właściwości, które nie kolidują z innymi.
- Zwraca
- Nową, unikalną wartość typu
symbol.
Przykład
#const id1 = Symbol('id')
const id2 = Symbol('id')
console.log(id1 === id2)
console.log(typeof id1)
console.log(id1.description)
console.log(id1.toString())Definicja i zastosowanie
#Symbol() tworzy nową, unikalną wartość typu symbol. Każde wywołanie daje inny symbol, nawet z tym samym opisem: Symbol("id") === Symbol("id") zwraca false. Opis w nawiasie służy tylko do debugowania i jest dostępny we właściwości description.
Najczęściej symbole służą jako klucze właściwości obiektów. Taki klucz nie zderzy się z żadnym napisem ani z kluczem dodanym przez inny kod, np. bibliotekę. Właściwości z kluczami symbolicznymi pomijają Object.keys(), pętla for...in i JSON.stringify(), więc dobrze nadają się na dane pomocnicze ukryte przed zwykłym przeglądaniem obiektu. Nie są jednak prywatne, bo odczyta je Object.getOwnPropertySymbols().
Język ma też symbole wbudowane, które pozwalają zmieniać zachowanie własnych obiektów. Symbol.iterator sprawia, że obiekt działa z for...of, a Symbol.toPrimitive decyduje o zamianie obiektu na liczbę lub napis. Symbol.for("klucz") zwraca symbol z globalnego rejestru, ten sam dla tego samego klucza w całej aplikacji. Symbolu nie tworzy się przez new.
Składnia
#Symbol()
Symbol(description)
Symbol.for(key)
const obj = { [symbol]: value }
obj[symbol]Parametry
#description
opcjonalny napis
Opis widoczny w konsoli i we właściwościdescription. Nie wpływa na unikalność symbolu.
Więcej przykładów
#const internalId = Symbol('internalId')
const student = { name: 'Ania', [internalId]: 42 }
console.log(student[internalId])
console.log(Object.keys(student))
console.log(JSON.stringify(student))
console.log(Object.getOwnPropertySymbols(student))const a = Symbol.for('app.theme')
const b = Symbol.for('app.theme')
console.log(a === b)
console.log(Symbol.keyFor(a))
console.log(Symbol('app.theme') === a)class Score {
constructor(points) {
this.points = points
}
[Symbol.toPrimitive](hint) {
return hint === 'number' ? this.points : `${this.points} pkt`
}
}
const score = new Score(120)
console.log(+score)
console.log(`${score}`)
console.log(score * 2)Silnik wywołuje metodę [Symbol.toPrimitive] przy każdej zamianie obiektu na wartość prostą. Argument hint mówi, czy potrzebna jest liczba ("number"), napis ("string"), czy obojętnie ("default").
Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Symbol nie daje prawdziwej prywatności. Do ukrytych danych w klasach używaj pól prywatnych
#pole. - Nie twórz symbolu przez
new Symbol(), bo to rzucaTypeError. Symbol jest wartością prymitywną, tak jak liczba czy napis. - Symbol nie zamienia się sam na napis:
"id: " + Symbol("x")rzucaTypeError. Użyjsymbol.toString()albosymbol.description.
Powiązane hasła
#- Iteratory (Symbol.iterator)Protokół iteracji: obiekt z metodą [Symbol.iterator]() działa z for...of, spreadem i destrukturyzacją.
- #polePola i metody z prefiksem # są prywatne: dostęp do nich ma wyłącznie kod wewnątrz klasy.
- Object.keys()Zwraca tablicę nazw własnych, wyliczalnych właściwości obiektu.
- typeofZwraca napis z nazwą typu wartości, np. "number", "string" albo "object".
- JSON.stringify()Zamienia wartość JavaScript, np. obiekt lub tablicę, na napis w formacie JSON.
Widzisz błąd albo brakuje przykładu? Napisz do nas.