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.
Na tej stronie

Przykład

#
JavaScript
const id1 = Symbol('id')
const id2 = Symbol('id')

console.log(id1 === id2)
console.log(typeof id1)
console.log(id1.description)
console.log(id1.toString())
Konsola
false
symbol
id
Symbol(id)

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

#
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ści description. Nie wpływa na unikalność symbolu.

Więcej przykładów

#
Klucz ukryty przed zwykłym przeglądaniem
JavaScript
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))
Konsola
42
['name']
{"name":"Ania"}
[Symbol(internalId)]
Globalny rejestr Symbol.for()
JavaScript
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)
Konsola
true
app.theme
false
Symbol wbudowany: Symbol.toPrimitive
JavaScript
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)
Konsola
120
120 pkt
240

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 rzuca TypeError. Symbol jest wartością prymitywną, tak jak liczba czy napis.
  • Symbol nie zamienia się sam na napis: "id: " + Symbol("x") rzuca TypeError. Użyj symbol.toString() albo symbol.description.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.