Коллекции с ключами

Вы можете использовать литералы объектов для хранения пар ключ-значение и массивы для хранения повторяемых коллекций значений. ES6 также вводит специализированные структуры данных для более детального использования: Map для пар ключ-значение и Set для отдельных значений.

Карта

Карта — это итерируемая структура данных, которая хранит информацию в виде пар ключ-значение, аналогично литералу объекта. В отличие от литералов объектов, карта позволяет значениям и ключам иметь любой тип данных, а порядок элементов, добавляемых в карту, сохраняется при итерации по ней.

Чтобы создать карту, используйте конструктор Map() :

const myMap = new Map();

myMap;
> Map(0)

Вы можете предварительно заполнить карту данными, используя синтаксис, напоминающий массив (или любой объект-итератор ), содержащий объекты, подобные массиву, состоящие из двух элементов. Первый элемент в каждой из этих двухэлементных структур данных становится ключом, а второй — значением, связанным с этим ключом. Простейшей формой этого является, по сути, массив, в котором каждый элемент сам по себе является массивом, состоящим из двух элементов: ключа и значения элемента, добавляемого на карту:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

Опять же, объект Map отличается от литерала объекта тем, что и значения , и ключи могут принимать любой тип данных и значение:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

Чтобы получить, установить или удалить элементы карты, используйте методы, унаследованные от конструктора Map :

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

Ключи в карте уникальны, а это означает, что установка идентичного ключа перезаписывает ранее сохраненную пару ключ-значение:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

Как и в случае с объектами, вы можете назначить Map переменной, объявленной с помощью const , а затем изменить эту карту. Однако, как и в других случаях использования const , вы не можете изменить или удалить саму переменную:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

Слабая карта

WeakMap — это карта, содержащая «слабые» ссылки , которые должны быть ссылками на объекты или символы , которые не были добавлены в глобальный реестр символов.

Чтобы создать WeakMap, используйте конструктор WeakMap() :

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

Синтаксис WeakMap аналогичен Map, но WeakMaps не является итерируемым , и попытка использовать в качестве ключа любое значение, кроме объекта или символа, приводит к синтаксической ошибке. Если за пределами WeakMap нет ссылок на ключ, этот объект или символ, а также связанное с ним значение в WeakMap, подлежат сборке мусора .

Это позволяет использовать такие варианты использования, как хранение метаданных, связанных с объектом, в WeakMap, используя ссылку на объект в качестве ключа. Если на этот объект не существует других ссылок и объект удаляется из памяти, связанные метаданные также удаляются.

Набор

Set — это повторяемая коллекция уникальных значений, чем-то похожая на массив, хотя Set может содержать только уникальные значения. Как и в случае с картой, перебор набора сохраняет элементы порядка, которые были добавлены в него.

Чтобы создать Set, используйте конструктор Set() :

const mySet = new Set();

mySet;
> Set []

Вы также можете создать Set из литерала Array:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Поскольку Set не допускает дублирования элементов, когда Set создается из массива, содержащего несколько экземпляров одного и того же значения, он сохраняет только первый экземпляр этого значения:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Чтобы добавить или удалить элементы из набора, используйте методы, унаследованные от конструктора Set . Эти методы действуют на элемент на основе значения самого элемента, а не ссылки на индекс:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

Хотя наборы не являются индексированными коллекциями и не предназначены для использования как таковые, элементы в наборе перебираются в порядке вставки. Попытки добавить повторяющееся значение элемента в Set пропускаются, сохраняя исходный порядок вставки:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

Чтобы создать массив из набора, используйте метод Array.from() или синтаксис расширения:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet — это набор, который содержит только значения, подлежащие сбору мусора , такие как ссылки на объекты или символы , которые не были добавлены в глобальный реестр символов.

Чтобы создать WeakSet, используйте конструктор WeakSet() :

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

Синтаксис WeakSet аналогичен Set, однако WeakSet не является итеративным , и попытка добавить любое значение, кроме объекта или символа, приводит к синтаксической ошибке. Как и в случае с WeakMap, когда других ссылок на значение, на которое ссылается WeakSet, не существует, это значение становится пригодным для сборки мусора .

Это позволяет использовать такие варианты использования, как агрегирование одной повторяемой коллекции связанных объектов. Если на объект, на который ссылается WeakSet, не существует других ссылок, связанный элемент также удаляется из WeakSet.

Проверьте свое понимание

Учитывая следующее:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

Что возвращает myMap ?

100
"My string"
undefined