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.
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"] — синтаксис обычного объекта, эту карту они не читают.
Ключ — сам объект
Ключом карты может быть объект. Хранится этот объект, а не строка из его полей. Другой объект с теми же полями — другой ключ.
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 отвечает да или нет. Само значение он не возвращает.
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, и множество остаётся прежним.
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.
<!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 был строкой страницы строгого режима.
Пять шагов у стойки
- Поставь lida в tea, затем в mint. get("lida") равен mint, size равен 1.
- Положи tea под cup. get(other) равен undefined, size остаётся 1.
- Добавь mint, ещё mint и lemon. size равен 2, has("lemon") равен true.
- Удали lemon. size равен 1, has("lemon") равен false.
- Прочитай страницу. Строка — lida / mint / 2.
Где легко промахнуться, и что запомнить
Второй set по тому же ключу — это обновление. Второй add той же добавки отбрасывается.
- Не читай карту через orders["lida"]
- Два похожих объекта — не один ключ
- has не возвращает напиток
- new Set уже убирает копии
- Не читай строку как ReferenceError
Пусть останется
- set заменяет, а size не растёт
- ключи-объекты — это сами объекты
- множество хранит каждое значение один раз
- delete снимает одну запись
- строка страницы — lida / mint / 2
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху