Кратко
Скопировано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
и другие.