Кратко
СкопированоWeak — это коллекция в которой можно хранить только объекты или незарегистрированные символы. Любой объект в Weak уникален, даже если добавить его несколько раз.
☝️ В JavaScript освобождение памяти осуществляется автоматически сборщиком мусора, и разработчик не имеет прямого контроля над этим процессом. Использование этой структуры данных помогает оптимизировать использование памяти, но не даёт возможности напрямую управлять временем жизни её объектов.
Одна из ключевых особенностей Weak — элементы в этой коллекции слабо связаны. Это означает, что коллекция хранит слабые ссылки на свои элементы. Слабая ссылка — это ссылка на объект, которая не препятствует его удалению сборщиком мусора. Если на объект больше нет сильных ссылок (т.е. обычных ссылок, удерживающих объект в памяти), сборщик мусора может автоматически удалить этот объект, даже если он находится в WeakSet.
Пример
Скопировано
var ws = new WeakSet()var obj = {}var foo = {}// Добавляем глобальный объект window в WeakSetws.add(window)// Добавляем объект objws.add(obj)console.log(ws.has(window))// true, window присутствует в WeakSetconsole.log(ws.has(foo))// false, foo не был добавлен// Удаляем window из WeakSetws.delete(window)console.log(ws.has(window))// false, window больше нет в WeakSet
var ws = new WeakSet()
var obj = {}
var foo = {}
// Добавляем глобальный объект window в WeakSet
ws.add(window)
// Добавляем объект obj
ws.add(obj)
console.log(ws.has(window))
// true, window присутствует в WeakSet
console.log(ws.has(foo))
// false, foo не был добавлен
// Удаляем window из WeakSet
ws.delete(window)
console.log(ws.has(window))
// false, window больше нет в WeakSet
Как пишется
СкопированоWeak полезен для временного хранения объектов без удержания их в памяти дольше необходимого. Например, при отслеживании DOM-элементов, которые могут быть удалены, Weak позволяет автоматически «забывать» об этих объектах, предотвращая утечки памяти.
Пример использования Weak — хранение метаданных о DOM-элементах, чтобы не препятствовать их удалению, когда они больше не нужны.
Особенности
СкопированоОбъекты из WeakSet могут быть удалены сборщиком мусора если он посчитает, что объект больше не используется [https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-liveness]. Это поведение отличается от поведения коллекции Set. Объекты, находящиеся в Set, не могут быть удалены.
В Weak нет механизмов для перебора элементов, например, for. Причина — это потенциально препятствует сборщику мусора удалять объекты. В результате Weak является непрозрачной коллекцией: вы можете проверить находится ли объект в коллекции при помощи методаhas, но вы не можете посмотреть что ещё лежит внутри.
Уникальность объектов. Все объекты в Weak уникальны вне зависимости от количества попыток добавить один и тот же элемент.
Методы
Скопированоadd добавляет объект в коллекцию Weak. Возвращает экземпляр Weak, что позволяет использовать методы цепочкой.
Параметр value у add — объект, который добавится в Weak.
Пример с add:
var ws = new WeakSet()var obj = {}ws.add(obj)
var ws = new WeakSet()
var obj = {}
ws.add(obj)
has проверяет присутствие объекта в Weak. Возвращает булево значение true, если объект присутствует, и false в противном случае.
У has может быть параметр value. Это объект, наличие которого нужно проверить.
Пример с has:
ws.has(obj)// true
ws.has(obj)
// true
delete удаляет объект из Weak, если он присутствует. Возвращает булево значение true, если объект удалён, и false, если объект не найден в коллекции.
Параметр delete — value. Это объект, который удаляем.
Пример использования delete:
ws.delete(obj)ws.has(obj)// false
ws.delete(obj)
ws.has(obj)
// false
Ограничения
СкопированоWeakподдерживает только объекты, примитивы (строки, числа, булевы значения) добавить нельзя.Set - Невозможно узнать, сколько объектов хранится в
Weak, так как сборщик мусора может автоматически их удалить.Set Weakне даёт итерироваться (перемещаться) по элементам коллекции.Set
Отличия от Set
СкопированоSet и Weak отличаются друг от друга. Во-первых, в Weak хранятся только объекты. В Set можете хранить любые типы данных.
Второе отличие — элементы Weak слабо связаны, что позволяет сборщику мусора удалять их, когда они больше не нужны. В Set этого не происходит.
Последнее отличие — в Weak нельзя перебирать элементы или узнать их количество. В Set для этого доступны разные методы. Например, size, итерирование через for и другие.