MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

Keyed collections

Этот раздел содержит обзор коллекций Set и словарей Map - встроенных структур данных с доступом по ключу.

Словари

Тип 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; // 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"

Больше примеров и полное описание на странице справочника Map .

Тип WeakMap 

WeakMap это специальный вид словаря, ключами которого могут быть только объекты, причём ссылки на них в WeakMap являются  слабыми (не учитываются  сборщиком мусора (garbage collector GC)).

Интерфейс WeakMap совпадает с Map, единственное отличие - ключи WeakMap не итерируемы (i.e. нельзя получить список ключей). Это понятно, поскольку в таком случае возникла бы неопределённость с достоверностью этого списка в зависимости от состояния  garbage collection.

Больше примеров, полное описание, а также обсуждение "Зачем козе баян WeakMap?"  на странице справочника WeakMap.

Отметим, что WeakMap, в частности, может элегантно использоваться для упаковки приватных данных или деталей реализации. Следующий пример из статьи Nick Fitzgerald "Hiding Implementation Details with ECMAScript 6 WeakMaps". Приватная часть сохраняется как значение в privates и имеет время жизни такое же как и сущность класса. Сам класс и его методы публичны; прочее недоступно извне модуля:

const privates = new WeakMap();

export class Public() {

  constructor() {
    const me = {
    // Private data goes here
    };
    // me будет освобождён вместе с this !!!
    privates.set(this, me);
  }

  method () {
    const me = privates.get(this);
    // Do stuff with private data in `me`...
  }
}

Коллекции

Тип Set 

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"

Больше примеров и полное описание на странице справочника 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 полагается равным самому себе (в отличие от ===).

Метки документа и участники

 Внесли вклад в эту страницу: Megabyteceer, alitskevich
 Обновлялась последний раз: Megabyteceer,