Simboluri
Simbolul sau tipul Symbol reprezintă o valoare unică.
Pentru a defini un simbol, se folosește constructorul de tip Symbol. De exemplu, să creăm un simbol simplu:
const tom = Symbol("Tom");
console.log(tom); // Symbol(Tom)
Fiecare simbol este unic. Haideți să încercăm să creăm două simboluri identice:
const tom = Symbol("Tom");
console.log(tom); // Symbol(Tom)
const tomas = Symbol("Tom");
console.log(tomas); // Symbol(Tom)
console.log(tom == tomas); // false
console.log(tom === tomas); // false
Simbolurile ca identificatori pentru proprietățile obiectelor
Domeniul principal de aplicare al simbolurilor constă în definirea identificatorilor pentru proprietățile obiectelor. Cu alte cuvinte, simbolurile permit evitarea situațiilor în care mai multe proprietăți ale unui obiect au același nume.
Această situație poate părea artificială, dar atunci când proprietățile sunt adăugate dinamic într-un program destul de mare sau într-un cod extern pe care nu-l putem controla, sarcina de a gestiona identificatorii pentru proprietăți devine mai complicată.
Pentru exemplificare, să luăm următoarea situație: într-o companie lucrează trei programatori, dintre care unul este dezvoltator senior, iar ceilalți doi sunt dezvoltatori juniori. Cu toate acestea, cei doi dezvoltatori juniori au nume identice.
De exemplu, unul dintre ei, Tom, este dezvoltatorul senior, în timp ce Sam și celălalt Tom sunt dezvoltatori juniori. Am putea reprezenta această companie astfel:
const company = {
"Tom": "senior",
"Sam": "junior",
"Tom": "junior"
}
for(developer in company) {
console.log(`${developer} - ${company[developer]}`);
}
Cu toate acestea, ieșirea în consolă va arăta că în compania noastră există doar doi dezvoltatori, deoarece numele a doi dintre ei coincid:
Tom - junior
Sam - junior
Acum să aplicăm simboluri:
const company = {
[Symbol("Tom")]: "senior",
[Symbol("Sam")]: "junior",
[Symbol("Tom")]: "junior"
}
const developers = Object.getOwnPropertySymbols(company);
for(developer of developers) {
console.log(`${developer.toString()} - ${company[developer]}`);
}
Pentru a obține toate simbolurile dintr-un obiect, se aplică funcția Object.getOwnPropertySymbols(), căreia i se furnizează obiectul. Această funcție returnează un set de simboluri pe care le putem itera într-un ciclu. Pentru a obține reprezentarea textului a simbolurilor, putem aplica metoda toString() a simbolului.
Pentru a obține valoarea, așa cum se întâmplă în general, se aplică sintaxa de acces la elementele unui array: company[developer] .În final, vom obține următoarea ieșire în consolă:
Symbol(Tom) - senior
Symbol(Sam) - junior
Symbol(Tom) - junior
De asemenea, puteți adăuga dinamic proprietăți cu identificatori simbolici în obiect:
const company = { };
company[Symbol("Tom")]= "senior";
company[Symbol("Sam")]= "junior";
company[Symbol("Tom")]= "junior";