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 идеалÑно подÑ
одÑÑ Ð´Ð»Ñ ÑÑого:
// ÐÑполнÑем `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); // true
ws.has(bar); // true
ws.delete(foo); // ÑдалÑем foo из набоÑа
ws.has(foo); // false, foo бÑл ÑдалÑн
ws.has(bar); // true, bar ÑоÑ
ÑанилÑÑ
ÐбÑаÑиÑе внимание, ÑÑо foo !== bar. ХоÑÑ ÑÑо поÑ
ожие обÑекÑÑ, ÑÑо не один и ÑÐ¾Ñ Ð¶Ðµ обÑекÑ. РпоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ оба добавлÑÑÑÑÑ Ð² набоÑ.
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-weakset-objects> |