Клавиша / esc

WeakSet

Коллекция, в которой временно хранятся уникальные объекты.

Время чтения: меньше 5 мин

Кратко

Скопировано

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

☝️ В JavaScript освобождение памяти осуществляется автоматически сборщиком мусора, и разработчик не имеет прямого контроля над этим процессом. Использование этой структуры данных помогает оптимизировать использование памяти, но не дает возможности напрямую управлять временем жизни её объектов.

Одна из ключевых особенностей WeakSet — элементы в этой коллекции слабо связаны. Это означает, что коллекция хранит слабые ссылки на свои элементы. Слабая ссылка — это ссылка на объект, которая не препятствует его удалению сборщиком мусора. Если на объект больше нет сильных ссылок (т.е. обычных ссылок, удерживающих объект в памяти), сборщик мусора может автоматически удалить этот объект, даже если он находится в 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

        
        
          
        
      

Как пишется

Скопировано

WeakSet полезен для временного хранения объектов без удержания их в памяти дольше необходимого. Например, при отслеживании DOM-элементов, которые могут быть удалены, WeakSet позволяет автоматически «забывать» об этих объектах, предотвращая утечки памяти.

Пример использования WeakSet — хранение метаданных о DOM-элементах, чтобы не препятствовать их удалению, когда они больше не нужны.

Особенности

Скопировано

Объекты из WeakSet могут быть удалены сборщиком мусора если он посчитает, что объект больше не используется [https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-liveness]. Это поведение отличается от поведения коллекции Set. Объекты находящиеся в Set не могут быть удалены.

В WeakSet нет механизмов для перебора элементов, например, forEach. Причина — это потенциально препятствует сборщику мусора удалять объекты. В результате WeakSet является непрозрачной коллекцией: вы можете проверить находится ли объект в коллекции при помощи методаhas(), но вы не можете посмотреть что ещё лежит внутри.

Уникальность объектов. Все объекты в WeakSet уникальны вне зависимости от количества попыток добавить один и тот же элемент.

Методы

Скопировано

add(value) добавляет объект в коллекцию WeakSet. Возвращает экземпляр WeakSet, что позволяет использовать методы цепочкой.

Параметр value у add() — объект, который добавится в WeakSet.

Пример с add():

        
          
          var ws = new WeakSet()var obj = {}ws.add(obj)
          var ws = new WeakSet()
var obj = {}
ws.add(obj)

        
        
          
        
      

has(value) проверяет присутствие объекта в WeakSet. Возвращает булево значение true, если объект присутствует, и false в противном случае.

У has() может быть параметр value. Это объект, наличие которого нужно проверить.

Пример с has():

        
          
          ws.has(obj)// true
          ws.has(obj)
// true

        
        
          
        
      

delete(value) удаляет объект из WeakSet, если он присутствует. Возвращает булево значение true, если объект удалён, и false, если объект не найден в коллекции.

Параметр delete()value. Это объект, который удаляем.

Пример использования delete():

        
          
          ws.delete(obj)ws.has(obj)// false
          ws.delete(obj)
ws.has(obj)
// false

        
        
          
        
      

Ограничения

Скопировано
  • WeakSet поддерживает только объекты, примитивы (строки, числа, булевы значения) добавить нельзя.
  • Невозможно узнать, сколько объектов хранится в WeakSet, так как сборщик мусора может автоматически их удалить.
  • WeakSet не даёт итерироваться (перемещаться) по элементам коллекции.

Отличия от Set

Скопировано

Set и WeakSet отличаются друг от друга. Во-первых, в WeakSet хранятся только объекты. В Set можете хранить любые типы данных.

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

Последнее отличие — в WeakSet нельзя перебирать элементы или узнать их количество. В Set для этого доступны разные методы. Например, size, итерирование через forEach() и другие.