Há 20 anos oferecendo as melhores soluções!

O que é JavaScript WeakMap

JavaScript WeakMap é uma estrutura de dados introduzida no ECMAScript 6, que permite a criação de mapas fracos, ou seja, mapas em que as chaves são fracamente referenciadas. Isso significa que as chaves em um WeakMap podem ser coletadas pelo coletor de lixo, mesmo que ainda estejam sendo referenciadas no mapa. Essa funcionalidade é extremamente útil em determinadas situações, como quando se deseja associar dados a objetos sem interferir no processo de coleta de lixo.

Como funciona o JavaScript WeakMap?

Para entender como o JavaScript WeakMap funciona, é importante primeiro entender o conceito de referência forte e referência fraca. Em JavaScript, uma referência forte é aquela que impede que um objeto seja coletado pelo coletor de lixo, enquanto uma referência fraca permite que o objeto seja coletado.

No caso do WeakMap, as chaves são referências fracas para os objetos. Isso significa que, se a única referência para um objeto for a chave em um WeakMap, o objeto poderá ser coletado pelo coletor de lixo. Isso é diferente de um Map convencional, onde as chaves são referências fortes e impedem que os objetos sejam coletados.

Para utilizar um WeakMap, é necessário criar uma instância do mesmo através do construtor WeakMap(). Em seguida, é possível adicionar pares chave-valor ao mapa utilizando o método set(). O método get() permite recuperar o valor associado a uma determinada chave, enquanto o método has() verifica se uma chave está presente no mapa. O método delete() remove um par chave-valor do mapa.

Quando usar o JavaScript WeakMap?

O JavaScript WeakMap é especialmente útil em situações em que se deseja associar dados a objetos sem interferir no processo de coleta de lixo. Isso pode ser útil, por exemplo, quando se está trabalhando com objetos temporários que não precisam ser mantidos em memória por muito tempo.

Além disso, o WeakMap também pode ser utilizado para evitar vazamentos de memória em determinadas situações. Por exemplo, se um objeto é utilizado como chave em um Map convencional e essa chave é mantida em memória por mais tempo do que o necessário, todos os objetos associados a essa chave também serão mantidos em memória, mesmo que não sejam mais necessários. Com o WeakMap, isso não acontece, pois os objetos associados a chaves fracamente referenciadas podem ser coletados pelo coletor de lixo.

Limitações do JavaScript WeakMap

Apesar de suas vantagens, o JavaScript WeakMap também possui algumas limitações. Uma delas é que as chaves em um WeakMap devem ser objetos. Não é possível utilizar tipos primitivos, como números ou strings, como chaves em um WeakMap.

Além disso, o WeakMap não possui métodos como keys() ou values(), que permitem obter todas as chaves ou valores presentes no mapa. Isso ocorre porque não é possível iterar sobre as chaves de um WeakMap, já que elas podem ser coletadas pelo coletor de lixo a qualquer momento.

Outra limitação é que o WeakMap não possui um tamanho fixo. Isso significa que não é possível saber quantos pares chave-valor estão presentes no mapa. Também não é possível percorrer os pares chave-valor em uma ordem específica, já que a ordem em que os objetos são coletados pelo coletor de lixo é imprevisível.

Exemplo de uso do JavaScript WeakMap

Para ilustrar o uso do JavaScript WeakMap, vamos considerar um exemplo em que desejamos associar informações adicionais a objetos DOM em uma página web. Suponha que temos uma lista de elementos de lista (tags <li>) e queremos armazenar informações adicionais sobre cada elemento, como seu índice na lista ou seu estado atual.

Podemos utilizar um WeakMap para associar essas informações aos objetos DOM. A chave do WeakMap seria o objeto DOM em si, enquanto o valor seria um objeto contendo as informações adicionais. Dessa forma, podemos acessar facilmente as informações adicionais de um objeto DOM específico, sem interferir no processo de coleta de lixo.

Veja o exemplo abaixo:

// Criação do WeakMap
const infoMap = new WeakMap();

// Função para associar informações adicionais a um objeto DOM
function setAdditionalInfo(element, info) {
  infoMap.set(element, info);
}

// Função para obter as informações adicionais de um objeto DOM
function getAdditionalInfo(element) {
  return infoMap.get(element);
}

// Uso do WeakMap
const liElement = document.querySelector('li');
setAdditionalInfo(liElement, { index: 0, state: 'active' });
const additionalInfo = getAdditionalInfo(liElement);
console.log(additionalInfo); // { index: 0, state: 'active' }

Nesse exemplo, utilizamos o WeakMap infoMap para associar informações adicionais aos objetos DOM representados pelas tags <li>. A função setAdditionalInfo() permite associar as informações ao objeto DOM, enquanto a função getAdditionalInfo() permite obter as informações associadas a um objeto DOM específico.

Conclusão

Em resumo, o JavaScript WeakMap é uma estrutura de dados que permite a criação de mapas fracos, em que as chaves são fracamente referenciadas. Isso é extremamente útil em situações em que se deseja associar dados a objetos sem interferir no processo de coleta de lixo. No entanto, o WeakMap possui algumas limitações, como a necessidade de utilizar apenas objetos como chaves e a impossibilidade de iterar sobre as chaves do mapa. Mesmo assim, o WeakMap é uma ferramenta poderosa no arsenal de um desenvolvedor JavaScript.