WeakSet
Базовая линия Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.
WeakSet — это коллекция значений, пригодных для сборки мусора, включая объекты и незарегистрированные символы. Значение в WeakSet может встречаться только один раз. Оно является уникальным в коллекции WeakSet.
Описание
Значения WeakSets должны быть пригодны для сборки мусора. Большинство примитивных типов данных могут быть созданы произвольно и не имеют срока жизни, поэтому их нельзя хранить. Объекты и незарегистрированные символы могут храниться, потому что они пригодны для сборки мусора.
Основные отличия от объекта Set:
-
WeakSet— это коллекции только объектов и символов. Они не могут содержать произвольные значения любого типа, в отличие отSet. -
WeakSetявляется слабым, что означает, что ссылки на объекты вWeakSetудерживаются слабо. Если других ссылок на значение, хранящееся вWeakSet, не существует, эти значения могут быть собраны сборщиком мусора.Примечание: Это также означает, что в коллекции нет списка текущих значений.
WeakSetsне перечисляются.
Равенство ключей
Как и обычные Set, равенство значений основано на алгоритме SameValueZero, который такой же, как оператор ===, потому что WeakSet могут содержать только объектные и символьные значения. Это означает, что для объектных значений равенство основано на идентичности объекта. Они сравниваются по ссылке, а не по значению.
Конструктор
-
WeakSet() - Создает новый объект
WeakSet.
Свойства экземпляра
Эти свойства определены на WeakSet.prototype и разделяются всеми экземплярами WeakSet.
-
WeakSet.prototype.constructor - Конструкторская функция, создавшая экземпляр объекта. Для экземпляров
WeakSetначальным значением является конструкторWeakSet. -
WeakSet.prototype[Symbol.toStringTag] - Начальным значением свойства
[Symbol.toStringTag]является строка"WeakSet". Это свойство используется вObject.prototype.toString().
Методы экземпляра
-
WeakSet.prototype.add() - Вставляет указанное значение в этот набор, если оно еще не присутствует.
-
WeakSet.prototype.delete() - Удаляет указанное значение из этого набора, если оно находится в наборе.
-
WeakSet.prototype.has() - Возвращает булево значение, указывающее, существует ли указанное значение в этом
WeakSetили нет.
Примеры
Использование объекта WeakSet
const ws = new WeakSet();
const foo = {};
const bar = {};
ws.add(foo);
ws.add(bar);
ws.has(foo); // true
ws.has(bar); // true
ws.delete(foo); // removes foo from the set
ws.has(foo); // false, foo has been removed
ws.has(bar); // true, bar is retained
Обратите внимание, что foo !== bar. Хотя это и похожие объекты, они не один и тот же объект. И поэтому оба добавляются в набор.
Обнаружение циклических ссылок
Функции, которые рекурсивно вызывают сами себя, нуждаются в способе защиты от циклических структур данных путем отслеживания обработанных объектов.
WeakSet идеально подходят для этой цели:
// Execute a callback on everything stored inside an object
function execRecursively(fn, subject, _refs = new WeakSet()) {
// Avoid infinite recursion
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; // Circular reference!
execRecursively((obj) => console.log(obj), foo);
Здесь WeakSet создается при первом запуске и передается при каждом последующем вызове функции (используя внутренний параметр _refs).
Количество объектов или порядок их обхода не имеют значения, поэтому WeakSet более подходит (и более производителен), чем Set, для отслеживания ссылок на объекты, особенно если участвует очень большое количество объектов.
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
WeakSet |
36 |
12 |
34 |
23 |
9 |
36 |
34 |
24 |
9 |
3.0 |
37 |
9 |
1.0.0 |
1.0 |
0.12.0 |
WeakSet |
36 |
12 |
34 |
23 |
9 |
36 |
34 |
24 |
9 |
3.0 |
37 |
9 |
1.0.0 |
1.0 |
0.12.0 |
add |
36 |
12 |
34 |
23 |
9 |
36 |
34 |
24 |
9 |
3.0 |
37 |
9 |
1.0.0 |
1.0 |
0.12.0 |
delete |
36 |
12 |
34 |
23 |
9 |
36 |
34 |
24 |
9 |
3.0 |
37 |
9 |
1.0.0 |
1.0 |
0.12.0 |
has |
36 |
12 |
34 |
23 |
9 |
36 |
34 |
24 |
9 |
3.0 |
37 |
9 |
1.0.0 |
1.0 |
0.12.0 |
symbol_as_keys |
109 |
109 |
146 |
95 |
16.4 |
109 |
146 |
74 |
16.4 |
21.0 |
109 |
16.4 |
1.0.0 |
1.28 |
20.0.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet