Baseline Widely available *
WeakMap
â ÑÑо коллекÑÐ¸Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение. РкаÑеÑÑве клÑÑей могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÑолÑко обÑекÑÑ Ð¸ незаÑегиÑÑÑиÑованнÑе ÑимволÑ, а знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÑоизволÑнÑÑ
Ñипов.
ÐлÑÑи в WeakMap Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑбоÑÐºÑ Ð¼ÑÑоÑа. ÐолÑÑинÑÑво пÑимиÑивнÑÑ Ñипов даннÑÑ Ð¼Ð¾Ð³ÑÑ Ð½Ðµ имеÑÑ Ð²Ñемени жизни, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ не могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð² каÑеÑÑве клÑÑей. ÐбÑекÑÑ Ð¸ незаÑегиÑÑÑиÑованнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÐºÐ»ÑÑами поÑÐ¾Ð¼Ñ ÑÑо они поддеÑживаÑÑ ÑбоÑÐºÑ Ð¼ÑÑоÑа.
ÐоÑÐµÐ¼Ñ WeakMap?ÐпÑÑнÑй JavaScript ÑазÑабоÑÑик замеÑиÑ, ÑÑо map API можно ÑеализоваÑÑ Ð½Ð° JavaScript c помоÑÑÑ Ð´Ð²ÑÑ Ð¼Ð°ÑÑивов (один Ð´Ð»Ñ ÐºÐ»ÑÑей, вÑоÑой Ð´Ð»Ñ Ð·Ð½Ð°Ñений) и ÑеÑÑÑÑÑ Ð¾Ð±ÑÐ¸Ñ API меÑодов. УÑÑановка ÑлеменÑов в ÑÑÐ¾Ñ map должна бÑÐ´ÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно запÑÑиÑÑ ÐºÐ»ÑÑи и знаÑениÑ. Ð ÑезÑлÑÑаÑе индекÑÑ ÐºÐ»ÑÑа и знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÐºÐ¾ÑÑекÑнÑми. ÐолÑÑение знаÑений Ñ map поÑÑебÑÐµÑ Ð¸ÑеÑиÑование клÑÑей, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи Ñовпадение, а заÑем иÑполÑзование индекÑа ÑÑого ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑего знаÑÐµÐ½Ð¸Ñ Ð¸Ð· маÑÑива знаÑений.
У Ñакой ÑеализаÑии бÑло Ð±Ñ Ð´Ð²Ð° главнÑÑ
неÑдобÑÑва. ÐеÑвÑм ÑвлÑеÑÑÑ O(n) поиÑк (где n â колиÑеÑÑво клÑÑей в map), Ñак как обе опеÑаÑии ÑÑебÑÑÑ Ð¸ÑеÑиÑование ÑпиÑка клÑÑей Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑовпадениÑ. ÐÑоÑÑм â пÑоблема ÑÑеÑки памÑÑи. Ð ÑловаÑÑÑ
, напиÑаннÑÑ
вÑÑÑнÑÑ, маÑÑив Ñ ÐºÐ»ÑÑами бÑÐ´ÐµÑ Ñ
ÑаниÑÑ ÑÑÑлки на обÑекÑÑ-клÑÑи, не Ð´Ð°Ð²Ð°Ñ Ð¸Ð¼ бÑÑÑ Ð¿Ð¾Ð¼ÐµÑеннÑми ÑбоÑÑиком мÑÑоÑа. РнаÑивнÑÑ
WeakMap
, ÑÑÑлки на обÑекÑÑ-клÑÑи Ñ
ÑанÑÑÑÑ Â«Ñлабо», ÑÑо ознаÑÐ°ÐµÑ Ñо, ÑÑо они не пÑедоÑвÑаÑÑÑ ÑбоÑÐºÑ Ð¼ÑÑоÑа в Ñом ÑлÑÑае, еÑли дÑÑгиÑ
ÑÑÑлок на обÑÐµÐºÑ Ð½Ðµ бÑдеÑ.
WeakMaps имеÑÑ "weak" («ÑлабÑе») обÑаÑÐµÐ½Ð¸Ñ Ðº клÑÑам обÑекÑа, а ÑледоваÑелÑно непÑепÑÑÑÑвие ÑбоÑÑÐ¸ÐºÑ Ð¼ÑÑоÑа, когда Ð¼Ñ Ð±Ð¾Ð»ÑÑе не имеем обÑекÑа-клÑÑа. WeakMaps могÑÑ Ð±ÑÑÑ Ð¾Ñобенно полезнÑми конÑÑÑÑкÑиÑми пÑи ÑопоÑÑавлении клÑÑей Ñ Ð¸Ð½ÑоÑмаÑией о клÑÑе, коÑоÑÑй Ñенен, ÑолÑко еÑли клÑÑ Ð½Ðµ бÑл ÑобÑан ÑбоÑÑиком мÑÑоÑа (Garbage collector).
Ðз-за Ñого, ÑÑо ÑÑÑлки ÑвлÑÑÑÑÑ ÑлабÑми, клÑÑи WeakMap
не пеÑеÑиÑлÑÐµÐ¼Ñ (Ñо еÑÑÑ Ð½ÐµÑ Ð¼ÐµÑода, коÑоÑÑй возвÑаÑÐ°ÐµÑ ÑпиÑок клÑÑей). ÐнаÑе ÑпиÑок Ð±Ñ Ð·Ð°Ð²Ð¸Ñел Ð¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ ÑбоÑа мÑÑоÑа, пÑедÑÑавлÑÑ Ð¸Ð½Ð´ÐµÑеÑминизм. ÐÑли Ð²Ñ Ñ
оÑиÑе имеÑÑ ÑпиÑок клÑÑей, вам ÑледÑÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÐµÐ³Ð¾ ÑамоÑÑоÑÑелÑно.
WeakMap()
СоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ WeakMap
.
ÐÑи ÑвойÑÑва опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² WeakMap.prototype
и еÑÑÑ Ñ Ð²ÑеÑ
ÑкземплÑÑов WeakMap
.
WeakMap.prototype.constructor
ФÑнкÑиÑ-конÑÑÑÑкÑоÑ, ÑоздаÑÑÐ°Ñ ÑкземплÑÑ Ð¾Ð±ÑекÑа. ÐÐ»Ñ ÑкземплÑÑов WeakMap
наÑалÑнÑм знаÑением ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ WeakMap
.
WeakMap.prototype[@@toStringTag]
ÐаÑалÑнÑм знаÑением ÑвойÑÑва @@toStringTag
ÑвлÑеÑÑÑ ÑÑÑока "WeakMap"
. ÐÑо ÑвойÑÑво иÑполÑзÑеÑÑÑ Ð² Object.prototype.toString()
.
WeakMap.prototype.delete()
УдалÑÐµÑ Ð·Ð½Ð°Ñение, ÑвÑзанное Ñ ÐºÐ»ÑÑом key
. ÐоÑле ÑÑого WeakMap.prototype.has(key)
бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ false
.
WeakMap.prototype.get()
ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, ÑвÑзанное Ñ ÐºÐ»ÑÑом key
или undefined
еÑли его неÑ.
WeakMap.prototype.has()
ÐозвÑаÑÐ°ÐµÑ Ð±Ñлево знаÑение, показÑваÑÑее ÑвÑзано ли знаÑение Ñ ÐºÐ»ÑÑом key
в обÑекÑе WeakMap
или неÑ.
WeakMap.prototype.set()
УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение value
Ð´Ð»Ñ ÐºÐ»ÑÑа key
в обÑекÑе WeakMap
. ÐозвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ WeakMap
.
WeakMap
const wm1 = new WeakMap();
const wm2 = new WeakMap();
const wm3 = new WeakMap();
const o1 = {};
const o2 = function () {};
const o3 = window;
wm1.set(o1, 37);
wm1.set(o2, "ÐÑивеÑ");
wm2.set(o1, o2); // знаÑением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑо Ñгодно, вклÑÑÐ°Ñ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð»Ð¸ ÑÑнкÑиÑ
wm2.set(o2, undefined);
wm2.set(wm1, wm2); // клÑÑами и знаÑениÑми могÑÑ Ð±ÑÑÑ Ð¾Ð±ÑекÑÑ Ð¸ даже WeakMap (!)
wm1.get(o2); // "ÐÑивеÑ"
wm2.get(o2); // undefined, поÑÐ¾Ð¼Ñ ÑÑо Ñакое знаÑение бÑло ÑÑÑановлено
wm2.get(o3); // undefined, поÑÐ¾Ð¼Ñ ÑÑо в wm2 Ð½ÐµÑ ÐºÐ»ÑÑа o3
wm1.has(o2); // true
wm2.has(o2); // true (даже еÑли Ñамо знаÑение Ñавно 'undefined')
wm2.has(o3); // false
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
ÐÑимеÑ: РеализаÑÐ¸Ñ ÐºÐ»Ð°ÑÑа WeakMap-подобнÑÑ
клаÑÑов Ñ Ð¼ÐµÑодом .clear()
class ClearableWeakMap {
#wm;
constructor(init) {
this.#wm = new WeakMap(init);
}
clear() {
this.#wm = new WeakMap();
}
delete(k) {
return this.#wm.delete(k);
}
get(k) {
return this.#wm.get(k);
}
has(k) {
return this.#wm.has(k);
}
set(k, v) {
this.#wm.set(k, v);
return this;
}
}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4