Привет, давайте поговорим о структурах данных 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
Спасибо!