--- title: Коллекции slug: Web/JavaScript/Guide/Keyed_collections tags: - коллекции - словари - структура данных translation_of: Web/JavaScript/Guide/Keyed_collections ---
Этот раздел содержит обзор коллекций {{jsxref("Set")}} и словарей {{jsxref("Map")}} - встроенных {{Glossary("Data_structure","структур данных")}} с доступом по ключу.
Тип Map
{{jsxref("Map")}} - реализация простого ассоциативного массива (словаря). Он содержит данные в виде набора пар ключ/значение(ключи уникальны) и предоставляет методы для доступа и манипулирования этими данными.
Также как и {{jsxref("Object", "объект", "", 1)}}, словарь позволяет
Словари, как специализированная структура данных, имеют существенные преимущества по сравнению с объектами:
В следующем примере приведены основные операции со словарём:
var sayings = new Map(); sayings.set("dog", "woof"); sayings.set("cat", "meow").set("elephant", "toot"); //вызов функции .set возвращает Map, поэтому set можно объединять в цепочки sayings.set("dog", "гав-гав"); // заменить значение по ключу sayings.size; // 3 sayings.get("fox"); // undefined sayings.has("bird"); // false sayings.delete("dog"); for (var [key, value] of sayings) { console.log(key + " goes " + value); } // "cat goes meow" // "elephant goes toot"
Больше примеров и полное описание на странице справочника {{jsxref("Map")}} .
Тип WeakMap
{{jsxref("WeakMap")}} это специальный вид словаря, ключами которого могут быть только объекты, причём ссылки на них в WeakMap являются слабыми (не учитываются сборщиком мусора (garbage collector GC)).
Интерфейс WeakMap
совпадает с Map
, единственное отличие - ключи WeakMap
нельзя итерировать (т.e. нельзя получить список ключей). Это понятно, поскольку в таком случае возникла бы неопределённость с достоверностью этого списка в зависимости от состояния garbage collection.
Больше примеров, полное описание, а также обсуждение "Зачем козе баян WeakMap?" на странице справочника {{jsxref("WeakMap")}}.
Отметим, что WeakMap,
в частности, может элегантно использоваться для упаковки приватных данных или деталей реализации. Следующий пример из статьи Nick Fitzgerald "Hiding Implementation Details with ECMAScript 6 WeakMaps". Приватная часть сохраняется как значение в privates
и имеет время жизни такое же как и сущность класса. Сам класс и его методы публичны; прочее недоступно извне модуля:
const privates = new WeakMap(); export class Public() { constructor() { const me = { // Приватные данные идут здесь }; // 'me' будет освобождён вместе с 'this' !!! privates.set(this, me); } method () { const me = privates.get(this); // Сделайте что-нибудь с приватными данными в 'me'... } }
Тип Set
{{jsxref("Set")}} реализация коллекции - структура данных, которая содержит список уникальных элементов в порядке их добавления.
В следующем примере приведены основные операции по работе с коллекцией Set:
var mySet = new Set(); mySet.add(1); mySet.add("some text"); mySet.add("foo"); mySet.has(1); // true mySet.delete("foo"); mySet.size; // 2 for (let item of mySet) console.log(item); // 1 // "some text"
Больше примеров и полное описание на странице справочника {{jsxref("Set")}}
Можно создать {{jsxref("Array")}} из Set с помощью {{jsxref("Array.from")}} или используя spread operator.
В свою очередь, конструктор Set
может принимать Array
в качестве аргумента.
Поскольку Set
структура работает с уникальными значениями, любые повторяющиеся элементы из Array будут проигнорированы.
Array.from(mySet); [...mySet2]; mySet2 = new Set([1,2,3,4]);
Сравнение Array
и Set
Словари, как специализированная структура данных, имеют существенные отличия по сравнению с массивами:
Тип WeakSet
{{jsxref("WeakSet")}} это специальный вид коллекции, элементами которой могут быть только объекты. Ссылки на эти объекты в WeakSet являются слабыми (не учитываются сборщиком мусора (garbage collector GC)).
Элементы WeakSet
уникальны и могут быть добавлены только один раз, также как и в {{jsxref("Set")}}.
Основные отличия от {{jsxref("Set")}}:
WeakSet
это коллекция объектов ( примитивные значения не могут быть добавлены).WeakSet
нельзя итерировать. А также нельзя получить список (итератор) элементов.Использование WeakSet
достаточно специфическое. Пользуясь тем, что они не могут создавать утечек памяти, в них можно, например, безопасно помещать ссылки на DOM элементы.
Больше примеров и полное описание на странице справочника {{jsxref("WeakSet")}}
Map
и Set
Сравнение на равенство ключей в Map
objects или объектов в Set
основано на "same-value-zero algorithm":
===
.-0
и +0
считаются равными (в отличие от ===
).===
).{{PreviousNext("Web/JavaScript/Guide/Indexed_Collections", "Web/JavaScript/Guide/Working_with_Objects")}}