Símbolos - JavaScript
Símbolos, representados pelo tipo Symbol
Symbol
const tom = Symbol("Tom");
console.log(tom); // Symbol(Tom)
Cada símbolo é único. Por exemplo, se tentarmos criar dois símbolos com o mesmo identificador:
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
Mesmo que os dois símbolos sejam inicializados com o mesmo valor, ambos os operadores de igualdade retornam false
Símbolos como identificadores de propriedades de objetos
Os símbolos são frequentemente usados como identificadores para propriedades de objetos, permitindo evitar conflitos onde propriedades poderiam ter o mesmo nome. Em programas grandes ou quando propriedades são adicionadas dinamicamente, controlar esses identificadores pode ser desafiador.
Considere uma empresa com três programadores, onde um é o desenvolvedor sênior e os outros dois são juniores. Curiosamente, dois deles se chamam Tom. Podemos representar esta situação assim:
const company = {
"Tom": "senior",
"Sam": "junior",
"Tom": "junior"
}
for(developer in company) {
console.log(`${developer} - ${company[developer]}`);
}
Este código resultará num problema, pois apenas dois desenvolvedores serão listados devido à duplicidade dos nomes:
Tom - junior Sam - junior
Agora usando símbolos
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]}`);
}
Para obter todos os símbolos de um objeto, usamos Object.getOwnPropertySymbols()
Saída no console:
Symbol(Tom) - senior Symbol(Sam) - junior Symbol(Tom) - junior
Adicionando propriedades dinamicamente
Símbolos também podem ser usados para adicionar propriedades de forma dinâmica a um objeto:
const company = {};
company[Symbol("Tom")] = "senior";
company[Symbol("Sam")] = "junior";
company[Symbol("Tom")] = "junior";
Essa flexibilidade dos símbolos oferece uma maneira robusta de manejar identificadores de propriedades em ambientes de programação complexos, onde a clareza e a unicidade são cruciais.