Explorando ES6: Map e WeakMap

Tempo de leitura: menos de 1 minuto

Neste post, irei resumidamente falar um pouco sobre Map e WeakMap, que são novas coleções que entraram no EcmaScript 6.

Map

Map é uma coleção de dados de chave e valor, onde sua chave é única na coleção, podendo haver um valor associado à ela. Os valores dentro de um mapa podem se repetir.

Mapas nos permitem:

  • Adicionar elementos pelo par, chave e valor;
  • Buscar elementos através da chave;
  • Descobrir se um elemento pertence ou não àquela coleção através da chave;
  • Remover elementos através da chave.

No JavaScript, objetos e mapas são extremamente parecidos, pois ambos são baseados em chave e valor, sendo que a chave é o nome do atributo e o valor podendo ser objetos, funções e expressões.

maps e objects em js

Métodos de Map

  • set()

É possível incluir qualquer tipo de valor como chave ou valor em um mapa em JavaScript, podendo ser valores primitivos, objetos ou funções.

Para adicionar elementos em um mapa, utilizamos o método set().

https://gist.github.com/mateusmarquezini/42a2af4de77fa7ed2e2804a0cad3228b

https://gist.github.com/mateusmarquezini/71d5c5730fb8b74309487ce09cb2cffe.js

  • size()

Para sabermos o tamanho do mapa com seus elementos, utilizamos o método size()

https://gist.github.com/mateusmarquezini/5e7a8d1d5ab6d9d2872192e5f67c8735

  • has()

Podemos também descobrir se uma determinada chave já existe associada a algum valor no mapa utilizando o método has(). Caso exista, o método retorna true, caso contrário, false.

https://gist.github.com/mateusmarquezini/2222b02d4db54df77d5ef1f8023b1d71

  • delete()

Para removermos um elemento específico de um mapa, utilizamos o método delete(). Basta usarmos como parâmetro do método a chave do registro a ser removido.

Após a execução, você pode garantir que o elemento foi removido com sucesso utilizando o método has() novamente.

https://gist.github.com/mateusmarquezini/d62b9f194447fbe28c4d251cd760ff59

Map é um objeto iterável e com isso é possível utilizar o laço de repetição for .. of para iteração através dos métodos abaixo:

  • keys()

Exibe as chaves dos elementos de um mapa.

https://gist.github.com/mateusmarquezini/d8d98c899d48ad10927b64b957fd1f01

Saída:

saida_keys

  • values()

Exibe os valores dos elementos de um mapa.

https://gist.github.com/mateusmarquezini/1624b115141034f5ee56b4e7346501dc

Saída:

saida_values

  • entries()

Diferente dos métodos acima, o entries() lhe dá uma visão geral dos elementos de um mapa em formato de chave e valor.

https://gist.github.com/mateusmarquezini/36e2d48651801ab13f73d1d32df54131

Saída:

saida_entries

  • clear()

Por fim, caso seja necessário realizar a remoção de todos os elementos de um mapa, basta utilizar o método clear().

Para checarmos se os elementos foram removidos, podemos invocar o método size()

https://gist.github.com/mateusmarquezini/6e59cf0629c521e1b63ba102da71cfba

WeakMap

Assim como Map, o WeakMap é uma coleção de dados de chave e valor e sua diferença é que ele não permite que qualquer valor seja usado como chave de seus registros, e sim, apenas objetos.

Esses objetos, até então, não são fortemente mantidos e, portanto, caso não haja nenhuma outra referência a esses objetos, o Garbage Collector pode agir destruindo esses objetos inutilizáveis na memória, liberando, assim, espaço para novos processos.

https://gist.github.com/mateusmarquezini/f90cfd7f3839fd152364368a46dd78a1

Caso a referência local de um objeto já existente dentro de um WeakMap for removido, não será mais possível buscar seu valor através da chave.

https://gist.github.com/mateusmarquezini/b141cf2aaffd4d09521b8c65526ed038

Lembrando que não é possível adicionar outro valor como chave além de objetos. Caso haja uma tentativa, um erro é exibido no console.

https://gist.github.com/mateusmarquezini/0fb4a8e55d80ef3371b2066b4a3569d8

Saída:

weak_map

Métodos de WeakMap

WeakMap não possui todos os métodos existentes em Map. Os métodos que há em comum entre as duas coleções são: has(), delete(), get() e set(). Todos aqui possuem o mesmo comportamento entre as duas coleções, ou seja, os comportamentos dos métodos em Map são os mesmos para WeakMap.

Como deve se perceber nos métodos acima, não temos a possibilidade de utilizarmos o método clear() para removermos todos os elementos de um WeakMap, nem mesmo temos uma visão geral da coleção com o método entries().

Para mais informações, exemplos e referências acesse: Map – MDN  / WeakMap – MDN

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *