Carregando...

Maps e Sets

A bebida fica numa Map, debaixo do nome do convidado. Os extras vão para um Set, e cada extra entra uma vez só. lida começa em tea e passa a mint. No conjunto entram mint e lemon. A linha da página é lida / mint / 2.

A página do modo estrito ficou para trás

Lá saiu ReferenceError, porque faltava um nome. Aqui nada é lançado. Chave que não existe: get devolve undefined.

A mesma chave troca a bebida

orders.set("lida", "tea") guarda a primeira bebida. orders.set("lida", "mint") não abre outra linha: o valor daquela chave é escrito por cima. size conta chaves, não quantas vezes set foi chamado.

Trocar uma bebida

javascript
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
console.log(orders.get("lida"));
console.log(orders.size);

No console aparece mint e depois 1. nima nunca foi guardado, então orders.get("nima") é undefined. orders.has("lida") é true. O mapa se lê com get. orders.lida e orders["lida"] são sintaxe de objeto e não leem este mapa.

A chave é o próprio objeto

Um mapa aceita um objeto como chave e fica com esse objeto, não com um texto montado dos campos. Outro objeto com os mesmos campos é outra chave.

Chaves objeto distintas

javascript
const cup = { guest: "lida" };
const other = { guest: "lida" };
const orders = new Map();
orders.set(cup, "tea");
console.log(orders.get(cup));
console.log(orders.get(other));
console.log(orders.size);

O console mostra tea, depois undefined, depois 1. Um objeto comum transformaria as duas chaves na string "[object Object]", e a segunda escrita cobriria a primeira. O mapa não faz isso.

A mint repetida não entra de novo

Duas chamadas a add("mint") deixam uma mint só. lemon é outro valor, então size fica 2. has responde sim ou não. Não devolve o valor.

Extras sem repetir

javascript
const extras = new Set();
extras.add("mint");
extras.add("mint");
extras.add("lemon");
console.log(extras.size);
console.log(extras.has("lemon"));

O console mostra 2 e depois true. new Set(["mint", "mint", "lemon"]) monta o mesmo conjunto: a cópia de mint já sumiu. Um set só tem valores. Não guarda bebida debaixo de um convidado.

delete tira uma entrada

Se removeu algo, delete devolve true. Se o valor não estava, devolve false e o conjunto continua como estava.

Tirar lemon

javascript
const extras = new Set(["mint", "lemon"]);
console.log(extras.delete("lemon"));
console.log(extras.size);
console.log(extras.has("lemon"));

O console mostra true, depois 1, depois false. mint continua lá. Um mapa também tem delete e has, mas eles usam a chave: orders.delete("lida") tira esse convidado.

O que a página escreve

A bebida de lida é trocada, o conjunto nasce de três palavras, e saem convidado, bebida e size.

A página — Map e Set

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
const extras = new Set(["mint", "mint", "lemon"]);
const line = document.querySelector("#line");
line.textContent = "lida / " + orders.get("lida") + " / " + extras.size;
</script>
</body>
</html>

A linha se lê lida / mint / 2. O primeiro set para tea não aparece. A mint repetida não aumenta size. ReferenceError era a linha do modo estrito.

Cinco passos no balcão

  1. Ponha lida em tea e depois em mint. get("lida") é mint e size é 1.
  2. Guarde tea sob cup. get(other) é undefined e size continua 1.
  3. Acrescente mint, mint e lemon. size é 2 e has("lemon") é true.
  4. Apague lemon. size é 1 e has("lemon") é false.
  5. Leia a página. A linha é lida / mint / 2.

O que confunde, e o que fica

Um segundo set na mesma chave atualiza. Um segundo add do mesmo extra é ignorado.

  • Não leia o mapa com orders["lida"]
  • Dois objetos parecidos não são uma chave só
  • has não devolve a bebida
  • new Set já descarta as cópias
  • Não leia a linha como ReferenceError

Para guardar

  • set substitui e size fica
  • chaves objeto são os próprios objetos
  • um set guarda cada valor uma vez
  • delete remove uma entrada
  • a linha da página é lida / mint / 2

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
4
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo