Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Стандартные встроенные объекты
  5. WeakSet

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

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.

Описание

Значения в WeakSet должны поддерживать сборку мусора. Большинствопримитивных типов данных могут не иметь времени жизни, поэтому они не могут быть сохранены. Объекты инезарегистрированные символы могут быть сохранены потому что они поддерживают сборку мусора.

Ключевые отличия отSet:

  • WeakSet — это набор толькообъектов и символов. В отличие отSet он не может содержать произвольные значения любого типа.

  • WeakSet являетсяслабым в том смысле, что ссылки на объекты вWeakSet хранятсяслабо. Если нет других ссылок на значение, хранящееся вWeakSet, эти значения могут быть удалены сборщиком мусора.

    Примечание:Это также означает, что нет списка текущих значений сохранённых в наборе. ОбъектыWeakSet не перечислимы.

Вариант использования: обнаружение циклических ссылок

Функциям, которые вызывают себя рекурсивно, необходим способ защиты от циклических структур данных путём отслеживания того, какие объекты уже были обработаны.

ОбъектыWeakSet идеально подходят для этого:

js
// Выполняем `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

js
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

Совместимость с браузерами

Смотрите также

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp