O JavaScript, sendo uma linguagem de programação versátil e poderosa, oferece várias estruturas de dados para lidar com diferentes necessidades de desenvolvimento. Duas dessas estruturas são o WeakMap e o WeakSet, que pertencem à categoria de coleções fracas, ou seja, coleções que permitem que seus elementos sejam coletados pelo coletor de lixo mesmo se ainda estiverem referenciados em outros lugares do código. Vamos explorar mais a fundo esses dois tipos de estruturas.
WeakMap
O WeakMap é uma estrutura de dados que mapeia chaves para valores, semelhante ao Map tradicional do JavaScript. No entanto, há uma diferença crucial: as chaves em um WeakMap só podem ser objetos, e esses objetos são mantidos de forma fraca, o que significa que não impedem que eles sejam coletados pelo coletor de lixo se não estiverem mais em uso em outras partes do código.
Características principais do WeakMap:
-
Chaves fracas: As chaves em um WeakMap são mantidas de forma fraca, o que significa que elas não impedem a coleta de lixo quando não são mais referenciadas em outras partes do código.
-
Acesso seguro aos valores: Como as chaves são mantidas de forma fraca, não é possível iterar sobre elas ou obter uma lista de chaves do WeakMap. Isso significa que não há métodos para obter todas as chaves do WeakMap, o que aumenta a segurança dos dados armazenados.
-
Uso comum: WeakMaps são frequentemente utilizados para associar dados adicionais a objetos sem interferir no processo de coleta de lixo. Isso é especialmente útil em situações onde você precisa anexar metadados a objetos temporários.
Exemplo de uso do WeakMap:
javascript// Criando um WeakMap
let mapaFraco = new WeakMap();
// Criando alguns objetos para serem usados como chaves
let obj1 = {};
let obj2 = {};
// Adicionando pares chave-valor ao WeakMap
mapaFraco.set(obj1, "Valor associado a obj1");
mapaFraco.set(obj2, "Valor associado a obj2");
// Obtendo valores usando as chaves
console.log(mapaFraco.get(obj1)); // "Valor associado a obj1"
console.log(mapaFraco.get(obj2)); // "Valor associado a obj2"
// Deixando de referenciar os objetos
obj1 = null;
obj2 = null;
// O coletor de lixo pode coletar os objetos não referenciados,
// o que automaticamente remove as entradas correspondentes do WeakMap
WeakSet
O WeakSet é uma coleção de objetos únicos, semelhante ao Set do JavaScript, mas com uma diferença importante: os objetos contidos em um WeakSet também são mantidos de forma fraca, o que significa que não impedem a coleta de lixo quando não são mais referenciados em outras partes do código.
Características principais do WeakSet:
-
Objetos mantidos de forma fraca: Assim como no WeakMap, os objetos armazenados em um WeakSet são mantidos de forma fraca, o que significa que não impedem sua coleta pelo coletor de lixo quando não são mais utilizados em outras partes do código.
-
Não permite iteração: Não é possível iterar sobre os elementos de um WeakSet ou obter uma lista de elementos contidos nele. Isso ocorre porque não há métodos para acessar individualmente os elementos de um WeakSet.
-
Uso comum: WeakSets são úteis quando se precisa armazenar referências a objetos únicos de forma que essas referências não impeçam a coleta de lixo. Isso pode ser útil em cenários onde é necessário rastrear a existência de objetos específicos sem manter uma referência direta a eles.
Exemplo de uso do WeakSet:
javascript// Criando um WeakSet
let conjuntoFraco = new WeakSet();
// Criando alguns objetos para serem adicionados ao WeakSet
let obj3 = {};
let obj4 = {};
// Adicionando objetos ao WeakSet
conjuntoFraco.add(obj3);
conjuntoFraco.add(obj4);
// Verificando se os objetos estão no WeakSet
console.log(conjuntoFraco.has(obj3)); // true
console.log(conjuntoFraco.has(obj4)); // true
// Deixando de referenciar os objetos
obj3 = null;
obj4 = null;
// O coletor de lixo pode coletar os objetos não referenciados,
// o que automaticamente remove as entradas correspondentes do WeakSet
Conclusão
Tanto o WeakMap quanto o WeakSet são estruturas de dados úteis em JavaScript, especialmente em situações onde é necessário armazenar dados de forma que não impeçam a coleta de lixo. Eles são especialmente úteis quando se lida com objetos temporários ou quando é necessário associar metadados a objetos sem interferir no processo de coleta de lixo. No entanto, é importante ter em mente que essas estruturas têm limitações, como a impossibilidade de iteração direta sobre os elementos, o que pode requerer abordagens diferentes ao lidar com conjuntos de dados.
“Mais Informações”

Claro, vou explicar mais detalhadamente sobre os tipos WeakMap e WeakSet em JavaScript.
Em JavaScript, os tipos WeakMap e WeakSet são estruturas de dados especiais que permitem armazenar coleções de objetos de forma que eles não impeçam a coleta de lixo quando não são mais referenciados em outras partes do código. Esses tipos são úteis em situações onde você deseja associar metadados ou informações adicionais a objetos, mas não quer que esses objetos impeçam a liberação de memória quando não são mais necessários.
Começando pelo WeakMap, ele é semelhante a um Map padrão em JavaScript, porém, com uma diferença crucial: as chaves em um WeakMap são fracas (ou seja, objetos cujas referências não impedem sua coleta de lixo). Isso significa que se a única referência para uma chave em um WeakMap for do próprio WeakMap, essa chave será elegível para coleta de lixo.
Por que isso é útil? Em muitos casos, você pode querer associar dados adicionais a objetos JavaScript, mas sem impedir que esses objetos sejam coletados pelo coletor de lixo quando não forem mais usados em outras partes do código. Por exemplo, suponha que você esteja desenvolvendo uma aplicação web e precise armazenar dados privados associados a elementos DOM. Usar um WeakMap para armazenar esses dados garantiria que os elementos DOM possam ser coletados quando forem removidos da árvore DOM, mesmo que os dados privados ainda estejam presentes no WeakMap.
Agora, quanto ao WeakSet, ele é semelhante a um Set padrão em JavaScript, com a diferença fundamental de que os objetos armazenados em um WeakSet também são fracos. Isso significa que, se a única referência a um objeto armazenado em um WeakSet for do próprio WeakSet, o objeto será elegível para coleta de lixo.
O principal uso de um WeakSet é manter uma coleção de objetos exclusivos sem impedir a coleta de lixo. Isso é útil em situações onde você deseja rastrear a presença de objetos únicos, mas não deseja impedir que esses objetos sejam coletados quando não são mais necessários. Por exemplo, você pode usar um WeakSet para rastrear referências a objetos DOM específicos em sua aplicação web. Se um elemento DOM for removido da árvore DOM e não for mais referenciado em nenhum outro lugar do código, ele será automaticamente removido do WeakSet quando coletado pelo coletor de lixo.
É importante notar que, devido à natureza fraca das referências em WeakMap e WeakSet, não é possível iterar diretamente sobre suas chaves ou valores. Isso ocorre porque o coletor de lixo pode remover objetos dessas estruturas de dados a qualquer momento, o que tornaria a iteração potencialmente inconsistente. Portanto, esses tipos não oferecem métodos como keys(), values() ou forEach() que estão presentes em estruturas de dados como Map e Set padrão.
Em resumo, os tipos WeakMap e WeakSet em JavaScript oferecem uma maneira conveniente de associar dados adicionais a objetos e rastrear objetos únicos, respectivamente, sem impedir a coleta de lixo. Eles são especialmente úteis em situações onde você precisa garantir que objetos sejam liberados da memória quando não são mais necessários, evitando vazamentos de memória e melhorando o desempenho geral de sua aplicação.


