This page was translated from English by the community.Learn more and join the MDN Web Docs community.
WeakSet
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2015 г..
* Some parts of this feature may have varying levels of support.
WeakSet — это набор значений, поддерживающих сборку мусора, включая объекты инезарегистрированные символы. Каждое значение вWeakSet может встречаться только один раз, оно уникально в коллекцииWeakSet.
In this article
Описание
Значения в WeakSet должны поддерживать сборку мусора. Большинствопримитивных типов данных могут не иметь времени жизни, поэтому они не могут быть сохранены. Объекты инезарегистрированные символы могут быть сохранены потому что они поддерживают сборку мусора.
Ключевые отличия отSet:
WeakSet— это набор толькообъектов и символов. В отличие отSetон не может содержать произвольные значения любого типа.WeakSetявляетсяслабым в том смысле, что ссылки на объекты вWeakSetхранятсяслабо. Если нет других ссылок на значение, хранящееся вWeakSet, эти значения могут быть удалены сборщиком мусора.Примечание:Это также означает, что нет списка текущих значений сохранённых в наборе. Объекты
WeakSetне перечислимы.
Вариант использования: обнаружение циклических ссылок
Функциям, которые вызывают себя рекурсивно, необходим способ защиты от циклических структур данных путём отслеживания того, какие объекты уже были обработаны.
ОбъектыWeakSet идеально подходят для этого:
// Выполняем `fn` для всего, что хранится внутри объекта.function execRecursively(fn, subject, _refs = new WeakSet()) { // Избегаем бесконечно рекурсии if (_refs.has(subject)) { return; } fn(subject); if (typeof subject === "object" && subject) { _refs.add(subject); for (const key in subject) { execRecursively(fn, subject[key], _refs); } _refs.delete(subject); }}const foo = { foo: "Foo", bar: { bar: "Bar", },};foo.bar.baz = foo; // Циклическая ссылка!execRecursively((obj) => console.log(obj), foo);ЗдесьWeakSet создаётся при первом запуске и передаётся вместе с каждым последующим вызовом функции (с использованием внутреннего параметра_refs).
Количество объектов или порядок их обхода не имеют значения, поэтому использованиеWeakSet более эффективно, чемSet для отслеживания ссылок на объекты, особенно если задействовано очень большое количество объектов.
Конструктор
WeakSet()Создаёт новый объект
WeakSet.
Свойств экземпляра
Эти свойства определены вWeakSet.prototype и есть у всех экземпляровWeakSet.
WeakSet.prototype.constructorФункция-конструктор, создающая экземпляр объекта. Для экземпляров
WeakSetначальным значением является конструкторWeakSet.WeakSet.prototype[@@toStringTag]Начальным значением свойства
@@toStringTagявляется строка"WeakSet". Это свойство используется вObject.prototype.toString().
Методы экземпляра
WeakSet.prototype.add()Добавляет
valueв объектWeakSet.WeakSet.prototype.delete()Удаляет
valueизWeakSet. После этогоWeakSet.prototype.has(value)будет возвращатьfalse.WeakSet.prototype.has()Возвращает булево значение, показывающее присутствует ли
valueв объектеWeakSetили нет.
Примеры
>ИспользованиеWeakSet
const ws = new WeakSet();const foo = {};const bar = {};ws.add(foo);ws.add(bar);ws.has(foo); // truews.has(bar); // truews.delete(foo); // удаляем foo из набораws.has(foo); // false, foo был удалёнws.has(bar); // true, bar сохранилсяОбратите внимание, чтоfoo !== bar. Хотя это похожие объекты,это неодин и тот же объект. И поэтому они оба добавляются в набор.
Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-weakset-objects> |