Привет, давайте поговорим о структурах данных ES6, называемых Set и WeakSet.

Набор

Тип данных набора представляет собой набор элементов (коллекцию), и вы можете перебирать элементы набора в порядке вставки. Другой важный момент заключается в том, что наборы представляют собой упорядоченные списки значений, которые не содержат повторяющихся элементов и доступны с помощью ключей, а не индексов.

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

WeakSet

WeakSet в основном аналогичен Set с двумя важными отличиями:

1 - значения, хранящиеся в WeakSet, не могут быть примитивными значениями (логическими, числовыми, строковыми или неопределенными)

2 - WeakSet является слабым: если нет другой ссылки на объект, хранящийся в WeakSet, они могут быть удалены сборщиком мусора. Из-за этого мы не можем взаимодействовать с элементами WeakSet.

Давайте посмотрим на один пример, использующий оба:

var _set = new Set();
var _weakset = new WeakSet();
(function () {
   var a = { x: 1 };
   var b = { y: 2 };
   _set.add(a);
   _weakset.add(b);
})();

В этом примере выше выполняется самозаполняющаяся функция, и после этого мы больше не можем ссылаться на {x: 1} и {y: 2}. В этом случае сборщик мусора удаляет указатель ключа b из «WeakSet», а также удаляет {y: 2} из памяти. Но в случае «Set» сборщик мусора не удаляет указатель из «Set», а также не удаляет {x: 1} из памяти.

Давайте попробуем поработать над этими коллекциями:

...
for (let x of _set) {
   console.log(x);
}
// output { x: 1 }
for (let x of _weakset) {
   console.log(x);
}
// output: _weakset[Symbol.iterator] is not a function

Как видите, «Set» может вызвать утечку памяти при неправильном использовании. Можно сказать, что ссылки «Set» являются сильными указателями, тогда как ссылки «WeakSet» - слабыми указателями.

Вот и все, ребята!

Предлагаю вам взглянуть на карту и WeakMap: https://medium.com/@leonardobrunolima/javascript-tips-map-and-weakmap-f38f9c4ed2b6

Спасибо!