This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Коллекции
Этот раздел содержит обзор коллекцийSet и словарейMap - встроенныхструктур данных с доступом по ключу.
In this article
Словари
>Тип Map
Map - реализация простого ассоциативного массива (словаря). Он содержит данные в виде набора пар ключ/значение(ключи уникальны) и предоставляет методы для доступа и манипулирования этими данными.
Также как иобъект, словарь позволяет
- получать значение по ключу, а также проверять наличие ключа
- добавлять/удалять пары ключ/значение
- перезаписывать значение по ключу (ключи уникальны).
- итерироваться по ключам
Словари, как специализированная структура данных, имеют существенные преимущества по сравнению с объектами:
- Ключи словаря могут быть любого типа (а не только строки).
- Словарь хранит свой размер (не надо вычислять).
- Натуральный порядок обхода элементов ( в порядке добавления) с помощью
for...of. - Словарь не подмешивает ключи из прототипа (в отличие от объекта).
В следующем примере приведены основные операции со словарём:
var sayings = new Map();sayings.set("dog", "woof");sayings.set("cat", "meow").set("elephant", "toot");//вызов функции .set возвращает Map, поэтому set можно объединять в цепочкиsayings.set("dog", "гав-гав"); // заменить значение по ключуsayings.size; // 3sayings.get("fox"); // undefinedsayings.has("bird"); // falsesayings.delete("dog");for (var [key, value] of sayings) { console.log(key + " goes " + value);}// "cat goes meow"// "elephant goes toot"Больше примеров и полное описание на странице справочникаMap .
Тип WeakMap
WeakMap это специальный вид словаря,ключами которого могут быть только объекты, причём ссылки на них в WeakMap являютсяслабыми (не учитываются сборщиком мусора (garbage collector GC)).
Примечание:ИнтерфейсWeakMap совпадает сMap, единственное отличие -ключиWeakMap нельзя итерировать (т.e. нельзя получить список ключей). Это понятно, поскольку в таком случае возникла бы неопределённость с достоверностью этого списка в зависимости от состояния garbage collection.
Больше примеров, полное описание, а также обсуждение "ЗачемWeakMap?" на странице справочникаWeakMap.
Отметим, чтоWeakMap, в частности, может элегантно использоваться для упаковки приватных данных или деталей реализации. Следующий пример взят из статьи Ника Фитцджеральда«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
Set реализация коллекции - структура данных, которая содержит список уникальных элементов в порядке их добавления.
В следующем примере приведены основные операции по работе с коллекциейSet:
var mySet = new Set();mySet.add(1);mySet.add("some text");mySet.add("foo");mySet.has(1); // truemySet.delete("foo");mySet.size; // 2for (let item of mySet) console.log(item);// 1// "some text"Больше примеров и полное описание на странице справочникаSet
Преобразования между Array и Set
Можно создатьArray из Set с помощьюArray.from или используяspread operator.
В свою очередь, конструкторSet может приниматьArray в качестве аргумента.
Примечание:ПосколькуSet структура работает с уникальными значениями, любые повторяющиеся элементы из Array будут проигнорированы.
Array.from(mySet);[...mySet2];mySet2 = new Set([1, 2, 3, 4]);Сравнение Array иSet
Словари, как специализированная структура данных, имеют существенные отличия по сравнению с массивами:
Set.hasработает быстрее чемArray.indexOf.- можно удалять элементы по значению (а не по индексу как массивах).
NaNобрабатывается корректно.- поддерживается уникальность значений.
Тип WeakSet
WeakSet это специальный вид коллекции, элементами которой могут быть только объекты. Ссылки на эти объекты в WeakSet являютсяслабыми (не учитываются сборщиком мусора (garbage collector GC)).
Примечание:ЭлементыWeakSet уникальны и могут быть добавлены только один раз, также как и вSet.
Основные отличия отSet:
WeakSetэто коллекцияобъектов ( примитивные значения не могут быть добавлены).WeakSetнельзя итерировать. А также нельзя получить список (итератор) элементов.
ИспользованиеWeakSet достаточно специфическое. Пользуясь тем, что они не могут создавать утечек памяти, в них можно, например, безопасно помещать ссылки на DOM-элементы.
Больше примеров и полное описание на странице справочникаWeakSet
Проверка на равенство вMap иSet
Сравнение на равенство ключей вMap objects или объектов вSet основано на "same-value-zero algorithm":
- алгоритм сравнения в целом совпадает с оператором
===. -0и+0считаются равными.NaNсчитается равным самому себе (в отличие от===).