Загрузка...

Map и Set

В Map напиток лежит под именем гостя. Set собирает добавки и оставляет каждую один раз. У lida сначала tea, потом напиток становится mint. В множество попадают mint и lemon. Строка на странице читается как lida / mint / 2.

Страница строгого режима была другой

Там вылетел ReferenceError: имени не было. Здесь ничего не выбрасывается. Нет ключа — get возвращает undefined.

Тот же ключ, другой напиток

orders.set("lida", "tea") кладёт первый напиток. orders.set("lida", "mint") не добавляет вторую строку: значение этого ключа перезаписывается. size считает ключи, а не то, сколько раз вызвали set.

Замена одного напитка

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

В журнале сначала mint, потом 1. Ключ nima не сохраняли, поэтому orders.get("nima") равен undefined. orders.has("lida") равен true. Карту читают через get. Записи orders.lida и orders["lida"] — синтаксис обычного объекта, эту карту они не читают.

Ключ — сам объект

Ключом карты может быть объект. Хранится этот объект, а не строка из его полей. Другой объект с теми же полями — другой ключ.

Объекты остаются разными ключами

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

В журнале tea, затем undefined, затем 1. Обычный объект превратил бы оба ключа в строку "[object Object]", и вторая запись заменила бы первую. Карта так не делает.

Вторая mint не остаётся

Два вызова add("mint") оставляют одну mint. lemon — второе значение, поэтому size равен 2. has отвечает да или нет. Само значение он не возвращает.

Добавки без копий

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

В журнале 2, затем true. new Set(["mint", "mint", "lemon"]) даёт то же множество: копия mint уже отброшена. У множества только значения. Напиток под гостем оно не хранит.

delete снимает одну запись

Если что-то удалилось, delete возвращает true. Если значения не было, приходит false, и множество остаётся прежним.

Удаление lemon

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

В журнале true, затем 1, затем false. mint всё ещё там. У карты тоже есть delete и has, но они работают с ключом: orders.delete("lida") убирает этого гостя.

Что пишет страница

Напиток lida заменяется, множество собирается из трёх слов, затем выводятся гость, напиток и size.

Строка страницы — Map и 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>

Строка читается lida / mint / 2. Первый set со значением tea уже не виден. Повтор mint не увеличивает size. ReferenceError был строкой страницы строгого режима.

Пять шагов у стойки

  1. Поставь lida в tea, затем в mint. get("lida") равен mint, size равен 1.
  2. Положи tea под cup. get(other) равен undefined, size остаётся 1.
  3. Добавь mint, ещё mint и lemon. size равен 2, has("lemon") равен true.
  4. Удали lemon. size равен 1, has("lemon") равен false.
  5. Прочитай страницу. Строка — lida / mint / 2.

Где легко промахнуться, и что запомнить

Второй set по тому же ключу — это обновление. Второй add той же добавки отбрасывается.

  • Не читай карту через orders["lida"]
  • Два похожих объекта — не один ключ
  • has не возвращает напиток
  • new Set уже убирает копии
  • Не читай строку как ReferenceError

Пусть останется

  • set заменяет, а size не растёт
  • ключи-объекты — это сами объекты
  • множество хранит каждое значение один раз
  • delete снимает одну запись
  • строка страницы — lida / mint / 2

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
4
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху