Ðак Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼ из Ð³Ð»Ð°Ð²Ñ Ð¡Ð±Ð¾Ñка мÑÑоÑа, движок JavaScript Ñ ÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² памÑÑи до ÑÐµÑ Ð¿Ð¾Ñ, пока они доÑÑÐ¸Ð¶Ð¸Ð¼Ñ (Ñо еÑÑÑ, ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸ÑполÑзованÑ).
ÐапÑимеÑ:
let john = { name: "John" };
// обÑÐµÐºÑ Ð´Ð¾ÑÑÑпен, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ john â ÑÑо ÑÑÑлка на него
// пеÑепиÑем ÑÑÑлкÑ
john = null;
// обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ ÑдалÑн из памÑÑи
ÐбÑÑно ÑвойÑÑва обÑекÑа, ÑлеменÑÑ Ð¼Ð°ÑÑива или дÑÑгой ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑÑиÑаÑÑÑÑ Ð´Ð¾ÑÑижимÑми и ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² памÑÑи до ÑÐµÑ Ð¿Ð¾Ñ, пока ÑÑа ÑÑÑÑкÑÑÑа даннÑÑ ÑодеÑжиÑÑÑ Ð² памÑÑи.
ÐапÑимеÑ, еÑли Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑим обÑÐµÐºÑ Ð² маÑÑив, Ñо до ÑÐµÑ Ð¿Ð¾Ñ, пока маÑÑив ÑÑÑеÑÑвÑеÑ, обÑÐµÐºÑ Ñакже бÑÐ´ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð² памÑÑи, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо дÑÑÐ³Ð¸Ñ ÑÑÑлок на него неÑ.
ÐапÑимеÑ:
let john = { name: "John" };
let array = [ john ];
john = null; // пеÑезапиÑÑваем ÑÑÑÐ»ÐºÑ Ð½Ð° обÑекÑ
// обÑÐµÐºÑ john Ñ
ÑаниÑÑÑ Ð² маÑÑиве, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ не бÑÐ´ÐµÑ ÑдалÑн ÑбоÑÑиком мÑÑоÑа
// Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ взÑÑÑ ÐµÐ³Ð¾ знаÑение как array[0]
ÐналогиÑно, еÑли Ð¼Ñ Ð¸ÑполÑзÑем обÑÐµÐºÑ ÐºÐ°Ðº клÑÑ Ð² Map, Ñо до ÑеÑ
поÑ, пока ÑÑÑеÑÑвÑÐµÑ Map, Ñакже бÑÐ´ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð¸ ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ. Ðн Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼ÐµÑÑо в памÑÑи и не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдалÑн ÑбоÑÑиком мÑÑоÑа.
ÐапÑимеÑ:
let john = { name: "John" };
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, "ok"); // ÑабоÑÐ°ÐµÑ (обÑÐµÐºÑ Ð² каÑеÑÑве клÑÑа)
// нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ ÑÑÑÐ¾ÐºÑ Ð² каÑеÑÑве клÑÑа
weakMap.set("test", "Whoops"); // ÐÑибка, поÑÐ¾Ð¼Ñ ÑÑо "test" не обÑекÑ
ТепеÑÑ, еÑли Ð¼Ñ Ð¸ÑполÑзÑем обÑÐµÐºÑ Ð² каÑеÑÑве клÑÑа и еÑли болÑÑе Ð½ÐµÑ ÑÑÑлок на ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ, Ñо он бÑÐ´ÐµÑ ÑдалÑн из памÑÑи (и из обÑекÑа WeakMap) авÑомаÑиÑеÑки.
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // пеÑезапиÑÑваем ÑÑÑÐ»ÐºÑ Ð½Ð° обÑекÑ
// обÑÐµÐºÑ john ÑдалÑн из памÑÑи!
СÑавниÑе ÑÑо поведение Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ обÑÑного Map, пÑÐ¸Ð¼ÐµÑ ÐºÐ¾ÑоÑого бÑл пÑиведÑн Ñанее. ТепеÑÑ john ÑÑÑеÑÑвÑÐµÑ ÑолÑко как клÑÑ Ð² WeakMap и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдалÑн оÑÑÑда авÑомаÑиÑеÑки.
WeakMap не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÐµÑÐµÐ±Ð¾Ñ Ð¸ меÑÐ¾Ð´Ñ keys(), values(), entries(), Ñак ÑÑо Ð½ÐµÑ ÑпоÑоба взÑÑÑ Ð²Ñе клÑÑи или знаÑÐµÐ½Ð¸Ñ Ð¸Ð· неÑ.
Ð WeakMap пÑиÑÑÑÑÑвÑÑÑ ÑолÑко ÑледÑÑÑие меÑодÑ:
weakMap.get(key)weakMap.set(key, value)weakMap.delete(key)weakMap.has(key)
Ð ÑÐµÐ¼Ñ Ñакие огÑаниÑениÑ? Ðз-за оÑобенноÑÑей ÑеÑ
ниÑеÑкой ÑеализаÑии. ÐÑли обÑÐµÐºÑ ÑÑÐ°Ð½ÐµÑ Ð½ÐµÐ´Ð¾ÑÑижим (как обÑÐµÐºÑ john в пÑимеÑе вÑÑе), Ñо он бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки ÑдалÑн ÑбоÑÑиком мÑÑоÑа. Ðо Ð½ÐµÑ Ð¸Ð½ÑоÑмаÑии, в какой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑоизойдÑÑ ÑÑа оÑиÑÑка.
РеÑение о Ñом, когда делаÑÑ ÑбоÑÐºÑ Ð¼ÑÑоÑа, пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð¸Ð¶Ð¾Ðº JavaScript. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑиÑаÑÑ Ð½ÐµÐ¾Ð±Ñ
одимÑм как ÑдалиÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¿ÑÑмо ÑейÑаÑ, Ñак и оÑложиÑÑ ÑÑÑ Ð¾Ð¿ÐµÑаÑиÑ, ÑÑÐ¾Ð±Ñ ÑдалиÑÑ Ð±Ð¾Ð»ÑÑее колиÑеÑÑво обÑекÑов за Ñаз позже. Так ÑÑо ÑеÑ
ниÑеÑки колиÑеÑÑво ÑлеменÑов в коллекÑии WeakMap неизвеÑÑно. Ðвижок Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизвеÑÑи оÑиÑÑÐºÑ ÑÑÐ°Ð·Ñ Ð¸Ð»Ð¸ поÑом, или ÑделаÑÑ ÑÑо ÑаÑÑиÑно. Ðо ÑÑой пÑиÑине меÑÐ¾Ð´Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа ко вÑем ÑÑÐ°Ð·Ñ ÐºÐ»ÑÑам/знаÑениÑм недоÑÑÑпнÑ.
Ðо Ð´Ð»Ñ Ñего же нам нÑжна ÑÐ°ÐºÐ°Ñ ÑÑÑÑкÑÑÑа даннÑÑ ?
ÐÑимеÑ: дополниÑелÑнÑе даннÑе
РоÑновном, WeakMap иÑполÑзÑеÑÑÑ Ð² каÑеÑÑве дополниÑелÑного Ñ
ÑанилиÑа даннÑÑ
.
ÐÑли Ð¼Ñ ÑабоÑаем Ñ Ð¾Ð±ÑекÑом, коÑоÑÑй «пÑинадлежиÑ» дÑÑÐ³Ð¾Ð¼Ñ ÐºÐ¾Ð´Ñ, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð°Ð¶Ðµ ÑÑоÑонней библиоÑеке, и Ñ
оÑим ÑоÑ
ÑаниÑÑ Ñ ÑÐµÐ±Ñ ÐºÐ°ÐºÐ¸Ðµ-Ñо даннÑе Ð´Ð»Ñ Ð½ÐµÐ³Ð¾, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑеÑÑвоваÑÑ Ð»Ð¸ÑÑ Ð¿Ð¾ÐºÐ° ÑÑÑеÑÑвÑÐµÑ ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ, Ñо WeakMap â как Ñаз Ñо, ÑÑо нÑжно.
ÐÑ ÐºÐ»Ð°Ð´Ñм ÑÑи даннÑе в WeakMap, иÑполÑзÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ°Ðº клÑÑ, и когда ÑбоÑÑик мÑÑоÑа ÑÐ´Ð°Ð»Ð¸Ñ Ð¾Ð±ÑекÑÑ Ð¸Ð· памÑÑи, аÑÑоÑииÑованнÑе Ñ Ð½Ð¸Ð¼Ð¸ даннÑе Ñоже авÑомаÑиÑеÑки иÑÑезнÑÑ.
weakMap.set(john, "ÑекÑеÑнÑе докÑменÑÑ");
// еÑли john ÑмÑÑÑ, "ÑекÑеÑнÑе докÑменÑÑ" бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑниÑÑоженÑ
ÐавайÑе ÑаÑÑмоÑÑим один пÑимеÑ.
ÐÑедположим, Ñ Ð½Ð°Ñ ÐµÑÑÑ ÐºÐ¾Ð´, коÑоÑÑй ведÑÑ ÑÑÑÑ Ð¿Ð¾ÑеÑений Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей. ÐнÑоÑмаÑÐ¸Ñ Ñ
ÑаниÑÑÑ Ð² коллекÑии Map: обÑекÑ, пÑедÑÑавлÑÑÑий полÑзоваÑелÑ, ÑвлÑеÑÑÑ ÐºÐ»ÑÑом, а колиÑеÑÑво визиÑов â знаÑением. Ðогда полÑзоваÑÐµÐ»Ñ Ð½Ð°Ñ Ð¿Ð¾ÐºÐ¸Ð´Ð°ÐµÑ (его обÑÐµÐºÑ ÑдалÑеÑÑÑ ÑбоÑÑиком мÑÑоÑа), Ñо болÑÑе Ð½ÐµÑ ÑмÑÑла Ñ
ÑаниÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑÑÑÑÑик поÑеÑений.
ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ ÑеализаÑии ÑÑÑÑÑика поÑеÑений Ñ Ð¸ÑполÑзованием Map:
// ð visitsCount.js
let visitsCountMap = new Map(); // map: полÑзоваÑÐµÐ»Ñ => ÑиÑло визиÑов
// ÑвелиÑиваем ÑÑÑÑÑик
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
Ð Ð²Ð¾Ñ Ð´ÑÑÐ³Ð°Ñ ÑаÑÑÑ ÐºÐ¾Ð´Ð°, возможно, в дÑÑгом Ñайле, коÑоÑÐ°Ñ Ð¸ÑполÑзÑÐµÑ countUser:
// ð main.js
let john = { name: "John" };
countUser(john); // ведÑм подÑÑÑÑ Ð¿Ð¾ÑеÑений
// полÑзоваÑÐµÐ»Ñ Ð¿Ð¾ÐºÐ¸Ð½Ñл наÑ
john = null;
ТепеÑÑ Ð¾Ð±ÑÐµÐºÑ john должен бÑÑÑ ÑдалÑн ÑбоÑÑиком мÑÑоÑа, но он пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð¾ÑÑаваÑÑÑÑ Ð² памÑÑи, Ñак как ÑвлÑеÑÑÑ ÐºÐ»ÑÑом в visitsCountMap.
Ðам нÑжно оÑиÑаÑÑ visitsCountMap пÑи Ñдалении обÑекÑа полÑзоваÑелÑ, инаÑе коллекÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð±ÐµÑконеÑно ÑаÑÑи. ÐÐ¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¾ÑиÑÑка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑдобна в ÑеализаÑии пÑи Ñложной аÑÑ
иÑекÑÑÑе пÑиложениÑ.
ÐÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ избежаÑÑ, еÑли иÑполÑзоваÑÑ WeakMap:
// ð visitsCount.js
let visitsCountMap = new WeakMap(); // map: полÑзоваÑÐµÐ»Ñ => ÑиÑло визиÑов
// ÑвелиÑиваем ÑÑÑÑÑик
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 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 Ð¾Ñ ÑÑавÑиÑ
ненÑжнÑми обÑекÑов.
Ðо еÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ WeakMap вмеÑÑо Map, Ñо ÑÑа пÑоблема иÑÑезнеÑ: закеÑиÑованнÑе ÑезÑлÑÑаÑÑ Ð±ÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð· памÑÑи ÑбоÑÑиком мÑÑоÑа.
// ð cache.js
let cache = new WeakMap();
// вÑÑиÑлÑем и запоминаем ÑезÑлÑÑаÑ
function process(obj) {
if (!cache.has(obj)) {
let result = /* вÑÑиÑлÑем ÑезÑлÑÑÐ°Ñ Ð´Ð»Ñ Ð¾Ð±ÑекÑа */ obj;
cache.set(obj, 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: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
visitedSet.add(john); // John заÑ
одил к нам
visitedSet.add(pete); // поÑом Pete
visitedSet.add(john); // John Ñнова
// visitedSet ÑейÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ Ð´Ð²ÑÑ
полÑзоваÑелей
// пÑовеÑим, заÑ
одил ли John?
alert(visitedSet.has(john)); // true
// пÑовеÑим, заÑ
одила ли Mary?
alert(visitedSet.has(mary)); // false
john = null;
// ÑÑÑÑкÑÑÑа даннÑÑ
visitedSet бÑÐ´ÐµÑ Ð¾ÑиÑена авÑомаÑиÑеÑки (обÑÐµÐºÑ john бÑÐ´ÐµÑ ÑдалÑн из visitedSet)
Ðаиболее знаÑиÑелÑнÑм огÑаниÑением WeakMap и WeakSet ÑвлÑеÑÑÑ Ñо, ÑÑо иÑ
нелÑÐ·Ñ Ð¿ÐµÑебÑаÑÑ Ð¸Ð»Ð¸ взÑÑÑ Ð²ÑÑ ÑодеÑжимое. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾ÑÑавлÑÑÑ Ð½ÐµÑдобÑÑва, но не меÑÐ°ÐµÑ WeakMap/WeakSet вÑполнÑÑÑ Ð¸Ñ
главнÑÑ Ð·Ð°Ð´Ð°ÑÑ â бÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм Ñ
ÑанилиÑем даннÑÑ
Ð´Ð»Ñ Ð¾Ð±ÑекÑов, ÑпÑавлÑемÑÑ
из какиÑ
-Ñо дÑÑгиÑ
меÑÑ Ð² коде.
ÐÑого
WeakMap â ÑÑо Map-Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ, позволÑÑÑÐ°Ñ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве клÑÑей ÑолÑко обÑекÑÑ, и авÑомаÑиÑеÑки ÑдалÑÑÑÐ°Ñ Ð¸Ñ
вмеÑÑе Ñ ÑооÑвеÑÑÑвÑÑÑими знаÑениÑми, как ÑолÑко они ÑÑановÑÑÑÑ Ð½ÐµÐ´Ð¾ÑÑижимÑми инÑми пÑÑÑми.
WeakSet â ÑÑо Set-Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ, коÑоÑÐ°Ñ Ñ
ÑÐ°Ð½Ð¸Ñ ÑолÑко обÑекÑÑ Ð¸ ÑдалÑÐµÑ Ð¸Ñ
, как ÑолÑко они ÑÑановÑÑÑÑ Ð½ÐµÐ´Ð¾ÑÑижимÑми инÑми пÑÑÑми.
Ðбе ÑÑÐ¸Ñ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ поддеÑживаÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва, ÑабоÑаÑÑие Ñо вÑем ÑодеÑжимÑм ÑÑÐ°Ð·Ñ Ð¸Ð»Ð¸ возвÑаÑаÑÑие инÑоÑмаÑÐ¸Ñ Ð¾ ÑазмеÑе коллекÑии. ÐÐ¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑолÑко опеÑаÑии на оÑделÑном ÑлеменÑе коллекÑии.
WeakMap и WeakSet иÑполÑзÑÑÑÑÑ ÐºÐ°Ðº вÑпомогаÑелÑнÑе ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
в дополнение к «оÑновномÑ» меÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа. ÐÑли обÑÐµÐºÑ ÑдалÑеÑÑÑ Ð¸Ð· оÑновного Ñ
ÑанилиÑа и нигде не иÑполÑзÑеÑÑÑ, кÑоме как в каÑеÑÑве клÑÑа в WeakMap или в WeakSet, Ñо он бÑÐ´ÐµÑ ÑдалÑн авÑомаÑиÑеÑки.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)