Symbol / Symbol.for în JavaScript

Proxy, Reflect și Symbol ES2015 (description: ES2019)

Creează valori unice, folosite ca chei de proprietăți care nu se ciocnesc cu alte chei.

Sintaxă
Symbol(descriere)
Symbol.for(cheie)
Symbol.keyFor(simbol)

Ce face Symbol / Symbol.for

Fiecare apel Symbol("descriere") creează o valoare nouă, diferită de oricare alta, chiar cu aceeași descriere. Ca cheie de proprietate, un simbol nu apare în for...in, Object.keys sau JSON.stringify, deci poți atașa date unui obiect fără să-i strici structura.

Symbol.for(cheie) folosește un registru global: returnează același simbol pentru aceeași cheie, oriunde în program. Symbol.keyFor(simbol) returnează cheia unui simbol din registru (sau undefined). toString() dă "Symbol(descriere)", iar description doar descrierea.

Limbajul folosește simboluri predefinite pentru comportamente speciale: Symbol.iterator face un obiect parcurgibil cu for...of, Symbol.toPrimitive controlează conversia în text sau număr.

Parametri

Parametru Descriere
descriere Opțional. Text folosit doar la afișare și depanare.
cheie Pentru Symbol.for: numele din registrul global.

Ce returnează

O valoare de tip symbol.

Exemple

Exemplul 1: Simboluri unice și registrul global

const a = Symbol("id");
const b = Symbol("id");
console.log(a === b, typeof a, a.toString(), a.description);

const g1 = Symbol.for("aplicatie.id");
const g2 = Symbol.for("aplicatie.id");
console.log(g1 === g2, Symbol.keyFor(g1), Symbol.keyFor(a));

Rezultat

false symbol Symbol(id) id
true aplicatie.id undefined

Exemplul 2: Chei ascunse și Symbol.iterator

const intern = Symbol("intern");
const produs = { nume: "Carte", [intern]: "nu apare în JSON" };
console.log(JSON.stringify(produs), produs[intern]);

const interval = {
  *[Symbol.iterator]() {
    for (let i = 1; i <= 3; i++) yield i * 10;
  },
};
console.log([...interval]);

Rezultat

{"nume":"Carte"} nu apare în JSON
[ 10, 20, 30 ]

Greșeli frecvente

  • Scrii new Symbol() și primești TypeError: Symbol is not a constructor. Simbolurile se creează fără new.
  • Lipești un simbol de un text cu + și primești TypeError. Folosește simbol.toString() sau simbol.description.

Comenzi înrudite