Як ми знаÑмо з ÑоздÑÐ»Ñ ÐбиÑÐ°Ð½Ð½Ñ ÑмÑÑÑÑ, ÑÑÑÑй JavaScript збеÑÑÐ³Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð² памâÑÑÑ, поки воно Ñ âдоÑÑÑпнимâ Ñ Ð¿Ð¾ÑенÑÑйно може бÑÑи викоÑиÑÑаним.
ÐапÑиклад:
let john = { name: "Ðван" };
// ÐбâÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð° оÑÑимаÑи, john -- Ñе поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° нÑого
// пеÑезапиÑемо поÑиланнÑ
john = null;
// обâÑÐºÑ Ð±Ñде видалено з памâÑÑÑ
ÐазвиÑай влаÑÑивоÑÑÑ Ð¾Ð±âÑкÑа або елеменÑÑв маÑÐ¸Ð²Ñ Ð°Ð±Ð¾ ÑнÑÐ¾Ñ ÑÑÑÑкÑÑÑи Ð´Ð°Ð½Ð¸Ñ Ð²Ð²Ð°Ð¶Ð°ÑÑÑÑÑ Ð´Ð¾ÑÑÑпними Ñа збеÑÑгаÑÑÑÑÑ Ð² памâÑÑÑ, поки Ñа ÑÑÑÑкÑÑÑа Ð´Ð°Ð½Ð¸Ñ Ñ Ð² памâÑÑÑ.
ÐапÑиклад, ÑкÑо ми покладемо обâÑÐºÑ Ð² маÑив, Ñо, поки маÑив живий, обâÑÐºÑ Ð±Ñде живим, навÑÑÑ ÑкÑо Ð½ÐµÐ¼Ð°Ñ ÑнÑÐ¸Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° Ñей обâÑкÑ.
ÐÑÑ Ñак:
let john = { name: "Ðван" };
let array = [ john ];
john = null; // пеÑезапиÑемо поÑиланнÑ
// обâÑкÑ, на Ñкий ÑанÑÑе поÑилалаÑÑ Ð·Ð¼Ñнна john, збеÑÑгаÑÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¼Ð°ÑивÑ
// ÑÐ¾Ð¼Ñ Ð²Ñн не бÑде видалений збиÑаÑем ÑмÑÑÑÑ
// ми можемо оÑÑимаÑи його Ñк array[0]
ÐодÑбно до ÑÑого, ÑкÑо ми викоÑиÑÑовÑÑмо обâÑÐºÑ Ñк клÑÑ Ñ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ð¼Ñ Map, Ñо в Ñой ÑаÑ, коли Map ÑÑнÑÑ, Ñей обâÑÐºÑ Ñакож ÑÑнÑÑ. ÐÑн Ð·Ð°Ð¹Ð¼Ð°Ñ Ð¿Ð°Ð¼âÑÑÑ Ñ Ð½Ðµ може бÑÑи видалений збиÑаÑем ÑмÑÑÑÑ.
ÐапÑиклад:
let john = { name: "Ðван" };
let map = new Map();
map.set(john, "...");
john = null; // пеÑезапиÑемо поÑиланнÑ
// john збеÑÑгаÑÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ map,
// ми можемо оÑÑимаÑи його, викоÑиÑÑовÑÑÑи map.keys()
WeakMap â пÑинÑипово вÑдÑÑзнÑÑÑÑÑÑ Ð² ÑÑÐ¾Ð¼Ñ Ð°ÑпекÑÑ. ÐÑн не пеÑеÑÐºÐ¾Ð´Ð¶Ð°Ñ Ð·Ð±Ð¸ÑÐ°Ð½Ð½Ñ ÑмÑÑÑÑ ÑеÑед обâÑкÑÑв, Ñо Ñ ÐºÐ»ÑÑами.
ÐодивимоÑÑ, Ñо Ñе ознаÑÐ°Ñ Ð½Ð° пÑÐ¸ÐºÐ»Ð°Ð´Ð°Ñ .
WeakMap
ÐеÑÑа вÑдмÑннÑÑÑÑ Ð¼Ñж Map Ñа WeakMap â Ñе Ñе, Ñо клÑÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи обâÑкÑами, а не пÑимÑÑивними знаÑеннÑми:
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ок"); // пÑаÑÑÑ (обâÑÐºÑ Ñ ÐºÐ»ÑÑем)
// не можна викоÑиÑÑовÑваÑи ÑÑдок Ñк клÑÑ
weakMap.set("ÑеÑÑ", "Ðй!"); // Ðомилка, ÑÐ¾Ð¼Ñ Ñо "ÑеÑÑ" не Ñ Ð¾Ð±âÑкÑом
ТепеÑ, ÑкÑо ми викоÑиÑÑовÑÑмо обâÑÐºÑ Ñк клÑÑ, Ñ Ð½ÐµÐ¼Ð°Ñ ÑнÑÐ¸Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° Ñей обâÑÐºÑ â його бÑде видалено з памâÑÑÑ (Ñ Ð· мапи) авÑомаÑиÑно.
let john = { name: "Ðван" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // пеÑезапиÑемо поÑиланнÑ
// john видалено з памâÑÑÑ!
ÐоÑÑвнÑйÑе його Ð·Ñ Ð·Ð²Ð¸Ñайним Map, Ñо наведений виÑе. ТепеÑ, ÑкÑо john ÑÑнÑÑ Ð»Ð¸Ñе Ñк клÑÑ WeakMap â вÑн бÑде авÑомаÑиÑно видалений з мапи (Ñ Ð· памâÑÑÑ).
WeakMap не пÑдÑÑимÑÑ ÑÑеÑаÑÑÑ Ñа меÑоди keys(), values(), entries(), ÑÐ¾Ð¼Ñ Ð½ÐµÐ¼Ð°Ñ ÑпоÑÐ¾Ð±Ñ Ð¾ÑÑимаÑи вÑÑ ÐºÐ»ÑÑÑ Ð°Ð±Ð¾ знаÑÐµÐ½Ð½Ñ Ð²Ñд нÑого.
WeakMap Ð¼Ð°Ñ Ð»Ð¸Ñе ÑÐ°ÐºÑ Ð¼ÐµÑоди:
Ð§Ð¾Ð¼Ñ Ñ Ñаке обмеженнÑ? Це з ÑеÑ
нÑÑниÑ
пÑиÑин. ЯкÑо обâÑÐºÑ Ð²ÑÑаÑив вÑÑ ÑнÑÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ (напÑиклад, john Ñ ÐºÐ¾Ð´Ñ Ð²Ð¸Ñе), Ñо вÑн бÑде авÑомаÑиÑно видалений збиÑаÑем ÑмÑÑÑÑ. Ðле ÑеÑ
нÑÑно Ð½ÐµÐ¼Ð°Ñ ÑоÑниÑ
вказÑвок коли вÑдбÑваÑÑÑÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ.
Ð ÑÑÑй JavaScript виÑÑÑÑÑ Ñе. ÐÑн може вибÑаÑи оÑиÑÐµÐ½Ð½Ñ Ð¿Ð°Ð¼âÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ або поÑекаÑи, Ñ Ð·ÑобиÑи оÑиÑÐµÐ½Ð½Ñ Ð¿ÑзнÑÑе, коли ÑÑапиÑÑÑÑ Ð±ÑлÑÑе видаленÑ. ÐÑже, ÑеÑ
нÑÑно, поÑоÑна кÑлÑкÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв WeakMap невÑдома. Ð ÑÑÑй, можливо, оÑиÑÑив його Ñи нÑ, або зÑобив Ñе ÑаÑÑково. Ð ÑÑÑÑ Ð¿ÑиÑини меÑоди, ÑÐºÑ Ð´Ð°ÑÑÑ Ð´Ð¾ÑÑÑп до вÑÑÑ
клÑÑÑв/знаÑÐµÐ½Ñ Ð½Ðµ пÑдÑÑимÑÑÑÑÑÑ.
ÐÑже, де нам поÑÑÑбна Ñака ÑÑÑÑкÑÑÑа Ð´Ð°Ð½Ð¸Ñ ?
ÐÑиклад викоÑиÑÑаннÑ: додаÑÐºÐ¾Ð²Ñ Ð´Ð°Ð½Ñ
ÐÑновна облаÑÑÑ Ð·Ð°ÑÑоÑÑÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ WeakMap â Ñе збеÑÑÐ³Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°ÑковиÑ
даниÑ
.
ЯкÑо ми пÑаÑÑÑмо з обâÑкÑом, Ñо âналежиÑÑâ до ÑнÑого кодÑ, можливо навÑÑÑ ÑÑоÑоннÑÐ¾Ñ Ð±ÑблÑоÑеки, Ñ Ñ
оÑÑли б збеÑегÑи деÑÐºÑ Ð´Ð°Ð½Ñ, повâÑÐ·Ð°Ð½Ñ Ð· ним, Ñо Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ ÑÑнÑваÑи лиÑе поки обâÑÐºÑ Ð¶Ð¸Ð²Ð¸Ð¹ â ÑÐ¾Ð´Ñ WeakMap ÑÑ Ñаме Ñе, Ñо поÑÑÑбно.
Ðи покладемо Ð´Ð°Ð½Ñ Ð² WeakMap, викоÑиÑÑовÑÑÑи обâÑÐºÑ Ñк клÑÑ, Ñ ÐºÐ¾Ð»Ð¸ обâÑÐºÑ Ð±Ñде видалено збиÑаÑем ÑмÑÑÑÑ, Ñо ÑÑ Ð´Ð°Ð½Ñ Ñакож авÑомаÑиÑно зникнÑÑÑ.
weakMap.set(john, "ÑекÑеÑÐ½Ñ Ð´Ð¾ÐºÑменÑи");
// ÑкÑо обâÑÐºÑ john зникне, ÑекÑеÑÐ½Ñ Ð´Ð¾ÐºÑменÑи бÑдÑÑÑ Ð·Ð½Ð¸ÑÐµÐ½Ñ Ð°Ð²ÑомаÑиÑно
ÐодивÑмоÑÑ Ð½Ð° пÑиклад.
У Ð½Ð°Ñ Ñ ÐºÐ¾Ð´, Ñкий збеÑÑÐ³Ð°Ñ ÐºÑлÑкÑÑÑÑ Ð²ÑдвÑдÑÐ²Ð°Ð½Ñ ÐºÐ¾ÑиÑÑÑваÑÑв. ÐнÑоÑмаÑÑÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ Ð² мапÑ: обâÑÐºÑ ÐºÐ¾ÑиÑÑÑваÑÑв Ñ ÐºÐ»ÑÑем, а кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑÐ²Ð°Ð½Ñ â Ñе знаÑеннÑ. Ðоли коÑиÑÑÑÐ²Ð°Ñ Ð·Ð½Ð¸ÐºÐ°Ñ (його обâÑÐºÑ Ð²Ð¸Ð´Ð°Ð»ÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ), ми бÑлÑÑе не Ñ Ð¾Ñемо збеÑÑгаÑи його кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑванÑ.
ÐÑÑ Ð¿Ñиклад ÑÑнкÑÑÑ Ð¿ÑдÑаÑ
ÑÐ½ÐºÑ Ð· Map:
// ð visitsCount.js
let visitsCountMap = new Map(); // мапа: коÑиÑÑÑÐ²Ð°Ñ => кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑванÑ
// збÑлÑÑиÑи кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑванÑ
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
РоÑÑ Ñе одна ÑаÑÑина кодÑ, можливо, ÑнÑий Ñайл викоÑиÑÑовÑÑ Ñе:
// ð main.js
let john = { name: "Ðван" };
countUser(john); // ÑаÑ
ÑÑ Ð¹Ð¾Ð³Ð¾ вÑзиÑи
// пÑзнÑÑе john Ð¿Ð¾ÐºÐ¸Ð´Ð°Ñ Ð½Ð°Ñ
john = null;
ÐаÑаз, обâÑÐºÑ john повинен бÑÑи видалений збиÑаÑем ÑмÑÑÑÑм, але залиÑаÑÑÑÑÑ Ð² памâÑÑÑ ÑомÑ, Ñо Ñе клÑÑ visitsCountMap.
Ðам поÑÑÑбно оÑиÑÑваÑи visitsCountMap, коли ми видалÑÑмо коÑиÑÑÑваÑÑв, ÑнакÑе вÑн бÑде ÑоÑÑи в памâÑÑÑ Ð½ÐµÐ¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾ довго. Таке оÑиÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ ÑÑаÑи нÑдним завданнÑм Ñ ÑкладниÑ
аÑÑ
ÑÑекÑÑÑаÑ
.
Ðи можемо ÑникнÑÑи ÑÑого, пеÑейÑовÑи на WeakMap:
// ð visitsCount.js
let visitsCountMap = new WeakMap(); // weakmap: коÑиÑÑÑÐ²Ð°Ñ => кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑванÑ
// збÑлÑÑиÑи кÑлÑкÑÑÑÑ Ð²ÑдвÑдÑванÑ
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¸ не Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¾ÑиÑаÑи visitsCountMap. ÐÑÑÐ»Ñ Ñого, Ñк обâÑÐºÑ john ÑÑÐ°Ñ Ð½ÐµÐ´Ð¾ÑÑÑпним бÑдÑ-Ñким ÑпоÑобом, за винÑÑком Ñого, Ñк клÑÑ WeakMap, вÑн видалÑÑÑÑÑÑ Ð· памâÑÑÑ, Ñазом з ÑнÑоÑмаÑÑÑÑ Ð·Ð° Ñим клÑÑем в WeakMap.
ÐÑиклад викоÑиÑÑаннÑ: кеÑÑваннÑ
ÐнÑим загалÑним пÑикладом Ñ ÐºÐµÑÑваннÑ. Ðи можемо збеÑÑгаÑи (âкеÑâ) ÑезÑлÑÑаÑи з ÑÑнкÑÑÑ, Ñоб майбÑÑÐ½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ на ÑÐ¾Ð¼Ñ Ð¶ обâÑкÑÑ Ð¼Ð¾Ð³Ð»Ð¸ повÑоÑно викоÑиÑÑовÑваÑи його.
Щоб доÑÑгÑи ÑÑого, ми можемо викоÑиÑÑовÑваÑи Map (не опÑималÑний ÑÑенаÑÑй):
// ð cache.js
let cache = new Map();
// обÑиÑлиÑи Ñа запамâÑÑаÑи ÑезÑлÑÑаÑ
function process(obj) {
if (!cache.has(obj)) {
let result = /* ÑозÑаÑ
Ñнки ÑезÑлÑÑаÑÑ Ð´Ð»Ñ */ obj;
cache.set(obj, result);
return result;
}
return cache.get(obj);
}
// Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¸ викоÑиÑÑовÑÑмо process() в ÑнÑÐ¾Ð¼Ñ ÑайлÑ:
// ð main.js
let obj = {/* ÑкажÑмо, Ñ Ð½Ð°Ñ Ñ Ð¾Ð±âÑÐºÑ */};
let result1 = process(obj); // ÑозÑаÑ
овано
// ...пÑзнÑÑе, з ÑнÑого мÑÑÑÑ Ð² кодÑ...
let result2 = process(obj); // запамâÑÑований ÑезÑлÑÑаÑ, взÑÑий з кеÑÑ
// ...пÑзнÑÑе, коли обâÑÐºÑ Ð±ÑлÑÑе не поÑÑÑбний:
obj = null;
alert(cache.size); // 1 (Ðй! ÐбâÑÐºÑ Ð´Ð¾ÑÑ Ð² кеÑÑ Ñ Ð·Ð°Ð¹Ð¼Ð°Ñ Ð¿Ð°Ð¼âÑÑÑ!)
ÐÐ»Ñ Ð±Ð°Ð³Ð°ÑоÑазовиÑ
викликÑв process(obj) з Ñим Ñамим обâÑкÑом вÑн лиÑе обÑиÑлÑÑ ÑезÑлÑÑÐ°Ñ Ð²Ð¿ÐµÑÑе, а поÑÑм пÑоÑÑо беÑе його з cache. ÐедолÑком Ñ Ñе, Ñо нам поÑÑÑбно ÑиÑÑиÑи cache, коли обâÑÐºÑ Ð±ÑлÑÑе не поÑÑÑбний.
ЯкÑо ми замÑнимо Map на WeakMap, Ñо ÑÑ Ð¿Ñоблема зникаÑ. ÐеÑований ÑезÑлÑÑÐ°Ñ Ð±Ñде видалено з памâÑÑÑ Ð°Ð²ÑомаÑиÑно пÑÑÐ»Ñ Ñого, Ñк обâÑÐºÑ Ð²Ð¸Ð´Ð°Ð»ÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ.
// ð cache.js
let cache = new WeakMap();
// обÑиÑлиÑи Ñа запамâÑÑаÑи ÑезÑлÑÑаÑ
function process(obj) {
if (!cache.has(obj)) {
let result = /* ÑозÑаÑ
ÑваÑи ÑезÑлÑÑÐ°Ñ Ð´Ð»Ñ */ obj;
cache.set(obj, result);
return result;
}
return cache.get(obj);
}
// ð main.js
let obj = {/* ÑкийÑÑ Ð¾Ð±âÑÐºÑ */};
let result1 = process(obj);
let result2 = process(obj);
// ...пÑзнÑÑе, коли обâÑÐºÑ Ð±ÑлÑÑе не поÑÑÑбний:
obj = null;
// Ðе можна оÑÑимаÑи cache.size ÑомÑ, Ñо Ñе WeakMap,
// але Ñе 0 або незабаÑом бÑде 0
// Ðоли obj видалÑÑÑÑÑÑ Ð·Ð±Ð¸ÑаÑем ÑмÑÑÑÑ, кеÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð°Ð½Ñ Ð±ÑдÑÑÑ Ð²Ð¸Ð»ÑÑÐµÐ½Ñ Ñакож
WeakSet
WeakSet поводиÑиÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑно:
- Це аналог
Set, але ми можемо додаÑи лиÑе обâÑкÑи доWeakSet(не пÑимÑÑиви). - ÐбâÑÐºÑ ÑÑнÑÑ Ð² набоÑÑ, коли вÑн доÑÑÑпний з де-небÑÐ´Ñ Ñе.
- Так Ñамо Ñк
Set, вÑн пÑдÑÑимÑÑadd,hasÑdelete, але не пÑдÑÑимÑÑsize,keys()Ñа ÑÑеÑаÑÑÑ.
ÐÑдÑÑи âÑлабкимâ, вÑн Ñакож ÑлÑжиÑÑ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°ÑковиÑ
даниÑ
. Ðле не Ð´Ð»Ñ Ð´Ð¾Ð²ÑлÑниÑ
даниÑ
, а Ð´Ð»Ñ ÑакÑÑв âÑак/нÑâ. ÐÑиналежнÑÑÑÑ Ð´Ð¾ WeakSet може ознаÑаÑи ÑоÑÑ Ð¿Ñо обâÑкÑ.
ÐапÑиклад, ми можемо додаÑи коÑиÑÑÑваÑÑв до WeakSet, Ñоб вÑдÑÑежÑваÑи ÑиÑ
, Ñ
Ñо вÑдвÑдав Ð½Ð°Ñ ÑайÑ:
let visitedSet = new WeakSet();
let john = { name: "Ðван" };
let pete = { name: "ÐеÑÑо" };
let mary = { name: "ÐаÑÑÑ" };
visitedSet.add(john); // Ðван вÑдвÑдав наÑ
visitedSet.add(pete); // ÐоÑÑм ÐеÑÑо
visitedSet.add(john); // ÐÐ½Ð¾Ð²Ñ Ðван
// visitedSet Ð¼Ð°Ñ Ð·Ð°Ñаз 2-оÑ
коÑиÑÑÑваÑÑв
// пеÑевÑÑÑе, Ñи вÑдвÑдав Ðван?
alert(visitedSet.has(john)); // true
// пеÑевÑÑÑе, Ñи вÑдвÑдала ÐаÑÑÑ?
alert(visitedSet.has(mary)); // false
john = null;
// visitedSet бÑде оÑиÑено авÑомаÑиÑно
ÐайбÑлÑÑ Ð¿Ð¾Ð¼ÑÑним обмеженнÑм WeakMap Ñа WeakSet Ñ Ð²ÑдÑÑÑнÑÑÑÑ ÑÑеÑаÑÑй Ñа нездаÑнÑÑÑÑ Ð¾ÑÑимаÑи веÑÑ Ð¿Ð¾ÑоÑний вмÑÑÑ. Це може виÑвиÑиÑÑ Ð½ÐµÐ·ÑÑÑним, але не пеÑеÑÐºÐ¾Ð´Ð¶Ð°Ñ WeakMap/WeakSet виконÑваÑи ÑÐ²Ð¾Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ñ ÑобоÑÑ â бÑÑи «додаÑковим» ÑÑ
овиÑем даниÑ
Ð´Ð»Ñ Ð¾Ð±âÑкÑÑв, ÑÐºÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ/ÑпÑавлÑÑÑÑÑÑ Ð² ÑнÑÐ¾Ð¼Ñ Ð¼ÑÑÑÑ.
ÐÑдÑÑмки
WeakMap â Ñе подÑбна до Map колекÑÑÑ, Ñка дозволÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи лиÑе обâÑкÑи, Ñк клÑÑÑ Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ ÑÑ
Ñазом з повâÑзаним знаÑеннÑм, коли вони ÑÑанÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпними ÑнÑим заÑобам.
WeakSet â Ñе подÑбна до Set колекÑÑÑ, Ñка збеÑÑÐ³Ð°Ñ ÑÑлÑки обâÑкÑи Ñа видалÑÑ ÑÑ
пÑÑÐ»Ñ Ñого, Ñк вони ÑÑанÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпними ÑнÑим заÑобам.
ÐÑ Ð¾Ñновна пеÑевага полÑÐ³Ð°Ñ Ñ ÑомÑ, Ñо вони маÑÑÑ Ñлабке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑкÑи, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¸ можÑÑÑ Ð±ÑÑи легко видаленими збиÑаÑем ÑмÑÑÑÑ.
Це доÑÑгаÑÑÑÑÑ Ð²Ð½Ð°ÑлÑдок вÑдÑÑÑноÑÑÑ Ð¿ÑдÑÑимки clear, size, keys, valuesâ¦
WeakMap Ñа WeakSet викоÑиÑÑовÑÑÑÑÑÑ Ñк âвÑоÑиннÑâ ÑÑÑÑкÑÑÑи даниÑ
, на додаÑок до âпеÑвинногоâ ÑÑ
овиÑа обâÑкÑÑв. ÐÑÑÐ»Ñ Ñого, Ñк обâÑÐºÑ Ð²Ð¸Ð´Ð°Ð»ÑÑÑÑÑÑ Ð· пеÑвинного ÑÑ
овиÑа, ÑкÑо вÑн виÑвлÑÑÑÑÑÑ Ð»Ð¸Ñе Ñк клÑÑ WeakMap або в WeakSet, вÑн бÑде оÑиÑений авÑомаÑиÑно.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)