Explorando ES6: Map e WeakMap

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().

let mapa = new Map()
function ler(){}
const carro = {}
mapa.set("texto", "A chave é do tipo string")
mapa.set(2, "A chave é do tipo numérico")
mapa.set(ler, "A chave é uma função")
mapa.set(carro, "A chave é um objeto")

view raw
map_set.js
hosted with ❤ by GitHub

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

  • size()

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

console.log(mapa.size) // 4

view raw
map_size.js
hosted with ❤ by GitHub

  • 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.

console.log(mapa.has("texto")) // true
console.log(mapa.has(2)) // true
console.log(mapa.has("Olá, mundo!")) // false
console.log(mapa.has(5)) // false

view raw
map_has.js
hosted with ❤ by GitHub

  • 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.

mapa.delete(2)
console.log(mapa.has(2)) // false

view raw
map_delete.js
hosted with ❤ by GitHub

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.

for(let chave of mapa.keys()){
console.log(chave)
}

view raw
map_keys.js
hosted with ❤ by GitHub

Saída:

saida_keys

  • values()

Exibe os valores dos elementos de um mapa.

for(let valor of mapa.values()){
console.log(valor)
}

view raw
mapa_values.js
hosted with ❤ by GitHub

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.

for(let elemento of mapa.entries()){
console.log(elemento)
}

view raw
mapa_entries.js
hosted with ❤ by GitHub

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()

mapa.clear()
console.log(mapa.size) // 0

view raw
map_clear.js
hosted with ❤ by GitHub

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.

let mapa = new WeakMap()
let pessoa = {}
let carro = {}
mapa.set(pessoa, "Eu sou uma pessoa")
mapa.set(carro, "Eu sou um carro")
console.log(mapa.get(pessoa)) // Eu sou uma pessoa
console.log(mapa.get(carro)) // Eu sou um carro

view raw
weakmap_set.js
hosted with ❤ by GitHub

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.

carro = null
console.log(mapa.get(carro)) // undefined

view raw
weakmap_get.js
hosted with ❤ by GitHub

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

let mapa = new WeakMap()
mapa.set(1, "Eu sou o número 1")
console.log(mapa.get(1))

view raw
weakmap_wrong_key.js
hosted with ❤ by GitHub

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

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: