Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Keyed collections

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

Словари

Тип Map 

Map - реализация простого ассоциативного массива (словаря). Он содержит данные в виде набора пар ключ/значение(ключи уникальны) и предоставляет методы для доступа и манипулирования этими данными.  

Также как и объект, словарь позволяет

  • получать значение  по ключу, а также проверять наличие ключа
  • добавлять/удалять пары ключ/значение
  • перезаписывать значение по ключу (ключи уникальны).
  • итерироваться по ключам

Словари, как специализированная структура данных, имеют существенные примущества по сравнению с объектами:

  • Ключи словаря могут быть любого типа (а не только строки).
  • Словарь хранит свой размер (не надо вычислять).
  • Натуральный порядок обхода элементов ( в порядке добавления) с помощью for...of.
  • Словарь не подмешивает ключи из прототипа (в отличие от объекта).

В следующем примере приведены основные операции со словарём:

var sayings = new Map();
sayings.set("dog", "woof");
// .set() возвращает sayings
sayings.set("cat", "meow").set("elephant", "toot");
// заменить значение по ключу
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 полагается равным самому себе (в отличие от ===).

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

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