Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.
Coleções chaveadas
Este capítulo apresenta coleções de dados que são ordenados por uma chave; Objetos Map e Set contêm elementos que são iteráveis em ordem de inserção.
In this article
Mapas
>Objeto Map
ECMAScript 6 apresenta uma nova estrutura de dados para mapear valores para valores. Um objetoMap é um simples mapa de chave/valor que pode ter seus elementos iterados por ordem de inserção.
O código a seguir mostra algumas operações básicas com umMap. Veja também a página de referência doMap para mais exemplos e a API completa. Você pode usar um laçofor...of para retornar um array de[chave, valor] para cada iteração.
var sayings = new Map();sayings.set("dog", "woof");sayings.set("cat", "meow");sayings.set("elephant", "toot");sayings.size; // 3sayings.get("fox"); // undefinedsayings.has("bird"); // falsesayings.delete("dog");sayings.has("dog"); // falsefor (var [key, value] of sayings) { console.log(key + " goes " + value);}// "cat goes meow"// "elephant goes toot"sayings.clear();sayings.size; // 0Object eMap comparados
Tradicionalmente,objetos tem sido usado para mapear strings para valores. Objetos permitem que você defina chaves para valores, recupere esses valores, exclua chaves e detecte se algo está armazenado em uma chave. ObjetosMap, contudo, possuem algumas vantagens que os tornam mapas melhores.
- As chaves de um
ObjetosãoStrings, onde elas podem ser de qualquer valor para umMap. - Você pode obter o tamanho de um
Mapfacilmente enquanto que para umObject, você tem que obter manualmente o seu tamanho. - A iteração de mapas é por ordem de inserção dos elementos.
- Um
Objecttem um protótipo, então existem chaves padrão no mapa. (este pode ser ignorado usandomap = Object.create(null)).
Estes dois tipos podem ajudar você a decidir se usa umMap ou umObject:
- Use mapas sobre objetos quando as chaves forem desconhecidas até a execução, e quando todas as chaves são do mesmo tipo e todos valores são do mesmo tipo.
- Use mapas caso haja a necessidade de armazenar valores primitivos como chaves, porque objetos tratam cada chave como uma string ou um valor numérico, valor booleano ou qualquer outro valor primitivo.
- Use objetos quando há uma lógica que opera em elementos individuais.
Objeto WeakMap
O objetoWeakMap é uma coleção de pares de chave/valor em que aschaves são somente objetos e seus valores podem ser valores arbitrários. As referências do objeto nas chaves sãofracamente mantidas, isso significa que eles são alvo da garbage collection (coleta de lixo) se não houver nenhuma outra referência para o objeto. A APIWeakMap é a mesma API doMap.
Uma diferença para objetosMap é que chavesWeakMap não são enumeráveis (isto é, não há um método que dê a você uma lista de chaves). Se eles fossem, a lista dependeria do estado da coleta de lixo, introduzindo um não-determinismo.
Para mais informações e código de exemplo, veja também "Por quê WeakMap?" na página de referênciaWeakMap.
Um caso de uso de objetosWeakMap é armazenar dados privados para um objeto ou ocultar detalhes de implementação. O exemplo a seguir é Nick Fitzgerald a partir de um post"Ocultando detalhes de implementação com WeakMaps ECMAScript 6" em seu blog. Os dados privados e métodos pertencem ao objeto e são armazenados nos objetos WeakMapprivados. Tudo exposto na instância e o protótipo é público, todo o restante é inacessível a partir do mundo externo por queprivado não é exportado pelo módulo.
const privates = new WeakMap();function Public() { const me = { // Dados privados vem aqui }; privates.set(this, me);}Public.prototype.method = function () { const me = privates.get(this); // Faça coisas com dado privado em `me`...};module.exports = Public;Conjuntos
>Objeto Set
ObjetosSet são coleções de valores. Você pode iterar seus elementos em ordem de inserção. Um valor em umSet só pode ocorrer uma vez; ele é único em uma coleçãoSet.
O código a seguir mostra algumas operações básicas com umSet. Veja também a página de referênciaSet para mais exemplos e a API completa.
var mySet = new Set();mySet.add(1);mySet.add("some text");mySet.add("foo");mySet.has(1); // truemySet.delete("foo");mySet.size; // 2for (let item of mySet) console.log(item);// 1// "some text"Conversão entre Array e Set
Você pode criar umArray a partir de um Set usandoArray.from ou ooperador de propagação. Além disso, o construtorSet aceita umArray para converter em outra direção. Observe novamente que objetosSet armazenam valores únicos, então quaisquer elementos duplicados de um Array são excluídos quando convertidos.
Array.from(mySet);[...mySet2];mySet2 = new Set([1, 2, 3, 4]);Array eSet comparados
Tradicionalmente, um conjunto de elementos tem sido armazenados em arrays JavaScript em muitas situações. O novo objetoSet, contudo, tem algumas vantagens:
- Checar se um elemento existe em uma coleção usando
indexOfpara arrays é lento. - Objetos
Setpermitem que você exclua elementos por seu valor. Com um array você teria que unir baseado no índice do elemento. - O valor
NaNnão pode ser encontrado comindexOfno array. - Objetos
Setarmazenam valores únicos, você não tem que manter o controle de duplicidades manualmente por você mesmo.
Objeto WeakSet
ObjetosWeakSet são coleções de objetos. Um objeto noWeakSet só pode ocorrer uma vez; Isto é único em coleçõesWeakSet e objetos não são enumeráveis.
As principais diferenças para objetosSet são:
- Em contraste com
Sets,WeakSetssãoapenas coleções de objetos e não de valores arbritários de qualquer tipo. - O
WeakSetéfraco: Referências para objetos são fracamente realizadas na coleção. Se não há outra referência para um objeto armazenado noWeakSet, eles podem ser coletados pelo coletor de lixo. Isso significa também que não há uma lista de objetos correntes armazenados na coleção.WeakSetsnão são enumeráveis.
Os casos de uso do objetoWeakSet são limitados. Eles não vão desperdiçar memória para ser seguro o uso de elementos DOM como chaves e marcá-los para propósitos de controle, por exemplo.
Igualdade de chave e valor doMap andSet
Ambos, a igualdade de chaves de objetosMap e a igualdade de valor de objetosSet, são baseados no "algoritmo mesmo valor de zero":
- Igualdade funciona como o operador de comparação de identidade
===. -0e+0são considerados iguais.NaNé considerado igual a ela mesmo (contrário de===).