Coleções com chave

É possível usar literais de objeto para armazenar pares de chave-valor e matrizes para armazenar coleções iteráveis de valores. O ES6 também introduz estruturas de dados especializadas para se adequar a casos de uso mais granulares: mapear para pares de valor-chave e definir para valores individuais.

Mapa

Um mapa é uma estrutura de dados iterável que armazena informações como pares de chave-valor, semelhante a um literal de objeto. Ao contrário dos literais de objetos, um Map permite os dois valores e para ter qualquer tipo de dados, e os elementos de ordem são adicionados a um Mapa é preservados ao iterar sobre eles.

Para criar um mapa, use o construtor Map():

const myMap = new Map();

myMap;
> Map(0)

Você pode pré-preencher um mapa com dados usando uma sintaxe semelhante a uma matriz (ou qualquer objeto iterador) que contém objetos do tipo matriz compostos por dois elementos. O primeiro elemento em cada um desses de dois elementos se torna a chave, enquanto o segundo se torna o valor. associado à chave. A forma mais simples disso é, na prática, uma matriz no qual cada elemento é uma matriz composta de dois elementos, a chave e o do elemento a ser adicionado ao mapa:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

Novamente, um objeto Map difere de um literal de objeto porque ambos os valores E as chaves podem assumir qualquer tipo e valor de dados:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

Para recuperar, definir ou excluir elementos do mapa, use os métodos herdados da Map. construtor:

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

As chaves em um mapa são únicas, o que significa que definir uma chave idêntica substitui a par de chave-valor armazenado anteriormente:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

Assim como nos objetos, você pode atribuir um mapa a uma variável declarada com const e e modificar esse mapa. No entanto, assim como em outros casos de uso de const, não é possível alterar ou excluir a própria variável:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

Um WeakMap é um mapa que contém "fraco" referências, que devem ser referências a objetos ou símbolos que não foram adicionados ao registro de símbolos global.

Para criar um WeakMap, use o construtor WeakMap():

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

A sintaxe WeakMap é semelhante à Map, mas WeakMaps não são iterable e tentando usar qualquer valor diferente de um objeto ou símbolo como chave causa um erro de sintaxe. Quando não referências a uma chave existem fora do WeakMap, esse objeto ou símbolo e o valor associado no WeakMap, ambos são qualificados para a coleta de lixo.

Isso permite casos de uso como o armazenamento de metadados associados a um objeto em um WeakMap, usando a referência ao objeto como a chave. Se nenhuma outra referência existir a esse objeto e ele for removido da memória, o evento também são removidos.

Definir

Um conjunto é uma coleção iterável de valores exclusivos um pouco semelhante a uma matriz, embora um conjunto possa conter apenas valores exclusivos. Assim como em um mapa, iterar em um O conjunto preserva a ordem em que os elementos foram adicionados.

Para criar um conjunto, use o construtor Set():

const mySet = new Set();

mySet;
> Set []

Você também pode criar um conjunto com base em um literal de matriz:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Como um conjunto não permite elementos duplicados, quando um conjunto é criado a partir de um que contém várias instâncias do mesmo valor, ela retém apenas a primeira desse valor:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Para adicionar ou remover elementos de um conjunto, use os métodos herdados de Set. construtor. Esses métodos agem sobre um elemento com base no valor dele em vez de referenciar um índice:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

Embora os conjuntos não sejam coleções indexadas e não se destinam ao uso como Assim, os elementos de um conjunto são iterados na ordem de inserção. As tentativas de adicionar um valor de elemento duplicado a um Set são pulado, preservando o pedido de inserção original:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

Para criar uma matriz com base em um conjunto, use o método Array.from() ou sintaxe:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet é um conjunto que contém apenas valores de coleta de lixo, como referências a objetos ou Símbolos que não foram adicionados ao registro de símbolos global.

Para criar um WeakSet, use o construtor WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

A sintaxe WeakSet é semelhante a Set, embora um WeakSet não seja iterable e tentando adicionar qualquer valor diferente de um objeto ou símbolo causa um erro de sintaxe. Assim como no WeakMap, quando nenhuma outra referência a um valor referenciado por um WeakSet, esse valor se torna qualificado para coleta de lixo.

Isso permite casos de uso como a agregação de uma única coleção iterável de objetos relacionados. Se não houver outras referências a um objeto referenciado pelo WeakSet, o elemento associado também será removido do WeakSet.

Teste seu conhecimento

Considere o seguinte:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

O que o myMap retorna?

100
"My string"
undefined