Símbolos em JavaScript
Símbolos, representados pelo tipo Symbol
no JavaScript, são valores únicos que não se repetem. Para definir um símbolo, usamos o construtor Symbol
. Por exemplo, vejamos como criar um símbolo simples:
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
, confirmando que cada símbolo é de fato único.
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()
. A saída no console mostrará claramente três desenvolvedores, incluindo os dois Toms, mas identificados de maneira única através dos símbolos.
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.