Baseline Widely available *
WeakMap
ì í¤/ê° ìì 모ìì¼ë¡, í¤ë ë°ëì ê°ì²´ ëë ë±ë¡ëì§ ìì ì¬ë³¼ì´ë©° ê°ì ììì JavaScript íì
ì
ëë¤. WeakMap
ì í¤ì ëí ê°ë ¥í 참조를 ìì±íì§ ìì¼ë¯ë¡, ê°ì²´ê° WeakMap
ì í¤ì í¬í¨ëëë¼ë ê°ë¹ì§ 컬ë ì
ì ëìì´ ë©ëë¤. í¤ ê°ì²´ê° ê°ë¹ì§ 컬ë í°ì ìí´ ì 리ë íìë, ë¤ë¥¸ ê³³ì ê°ë ¥í ì°¸ì¡°ê° ì¡´ì¬íì§ ìë í, í¤ì ì°ê²°ëë ê° ëí ê°ë¹ì§ 컬ë ì
ëìì´ ë©ëë¤. WeakMap
ì í¤ë¡ ì¬ì©í ì ìë ì ì¼í ìì ê°ì ì¬ë³¼, ì ííë ë±ë¡ëì§ ìì ì¬ë³¼ì¸ë°, ë±ë¡ëì§ ìì ì¬ë³¼ì ê³ ì í¨ì´ ë³´ì¥ëë©° ë¤ì ìì±í ì ì기 ë문ì
ëë¤.
WeakMap
ì ì¬ì©íë©´ ê°ì´ í¤ë¥¼ 참조íëë¼ë í¤ ê°ì²´ì ê°ë¹ì§ 컬ë ì
ì ë°©ì§íì§ ìë ë°©ìì¼ë¡ ë°ì´í°ë¥¼ ê°ì²´ì ì°ê²°í ì ììµëë¤. ê·¸ë¬ë WeakMap
ì í¤ì íì± ìí를 ê´ì°°íë ê²ì íì©íì§ ìì¼ë©°, ì´ë WeakMap
ì í¤ë¥¼ ì´ê±°í ì ìë ì´ì ì
ëë¤. ë§ì½ WeakMap
ì´ í¤ ëª©ë¡ì ì»ì ì ìë ì´ë¤ ë©ìë를 ì ê³µíë¤ë©´, ê·¸ 목ë¡ì ê°ë¹ì§ 컬ë ì
ìíì ë°ë¼ ë¬ë¼ì§ ê²ì´ë¯ë¡ ë¹ê²°ì ì±ì´ ë°ìí©ëë¤. í¤ ëª©ë¡ì´ íìíë©´ WeakMap
ëì Map
ì ì¬ì©í´ì¼ í©ëë¤.
í¤ ê¸°ë° ì»¬ë ì
ìë´ìì WeakMap ê°ì²´ 구íìì WeakMap
ì ëí´ ìì¸í ììë³¼ ì ììµëë¤.
WeakMap
ì í¤ë ë°ëì ê°ë¹ì§ 컬ë ì
ê°ë¥í´ì¼ í©ëë¤. ëë¶ë¶ì ìì ê°ì ììë¡ ìì±ë ì ìê³ ìëª
ì£¼ê¸°ê° ë°ë¡ ìì¼ë¯ë¡ í¤ë¡ ì¬ì©í ì ììµëë¤. ê°ì²´ì ë±ë¡ëì§ ìì ì¬ë³¼ì ê°ë¹ì§ 컬ë ì
ëìì´ë¯ë¡ í¤ë¡ ì¬ì©í ì ììµëë¤.
JavaScriptì ë§µ APIë 4ê°ì API ë©ìëì ì´ë¤ì´ ê³µì íë ë ê°ì ë°°ì´(í¤ì© íë, ê°ì© íë)ì¼ë¡ë 구ííë ¤ë©´ 구íí ì ììµëë¤. ì´ ë§µì ìì를 ì¶ê°íë©´ í¤ì ê°ì ëìì ê° ë°°ì´ì ëì¼ë¡ ë£ë ìì ì ìíí ê²ì ëë¤. ê²°ê³¼ì ì¼ë¡, í¤ì ê°ì´ ë ë°°ì´ ê°ê°ìì ê°ì ì¸ë±ì¤ì ìì¹íê² ë©ëë¤. ë§µìì ê°ì ê°ì ¸ì¤ë ¤ë©´ í¤ ë°°ì´ì ìííë©´ì ì¼ì¹íë í목ì ì°¾ê³ , ì´ í목ì ì¸ë±ì¤ë¡ ê° ë°°ì´ìì ê°ì ê°ì ¸ì¬ ê²ì ëë¤.
ì´ êµ¬íìë ë ê°ì§ í° ë¶í¸í¨ì´ ììµëë¤.
O(n)
(nì ë§µ í¤ì ì)ì
ëë¤. ë ìì
모ë ì¼ì¹íë ê°ì 찾기 ìí´ í¤ ëª©ë¡ì ìíí´ì¼ í기 ë문ì
ëë¤.ë°ë©´, WeakMap
ìì í¤ ê°ì²´ë ê°ë¹ì§ 컬ë ì
ëì§ ìë í ìì ì ê°ì ê°ë ¥íê² ì°¸ì¡°íê³ , ê·¸ íìë ì½íê² ì°¸ì¡°í©ëë¤. ë°ë¼ì WeakMap
ì ë¤ìê³¼ ê°ìµëë¤.
WeakMap
ë°ì ë¤ë¥¸ ê³³ìì 참조ëì§ ìì¼ë©´ ê·¸ ê°ì ê°ë¹ì§ 컬ë ì
ë íì©í©ëë¤.WeakMap
ì ê°ë¹ì§ 컬ë ì
ëì§ ììì¼ë§ ì ì©í í¤ì ì 보를 매íí ë í¹í ì ì©í 구조ì
ëë¤.
ê·¸ë¬ë WeakMap
ì í¤ì íì± ìí를 ê´ì°°íë ê²ì íì©íì§ ìì¼ë¯ë¡ í¤ë¥¼ ì´ê±°í ì ììµëë¤. í¤ ëª©ë¡ì ì»ì ì ìë ë°©ë²ì ì¡´ì¬íì§ ììµëë¤. ê·¸ë° ë°©ë²ì´ ì¡´ì¬íë¤ë©´, í¤ ëª©ë¡ì ê°ë¹ì§ 컬ë ì
ìíì ë°ë¼ ë¬ë¼ì§ ê²ì´ë¯ë¡ ë¹ê²°ì ì±ì´ ë°ìí©ëë¤. í¤ ëª©ë¡ì´ íìíë©´ Map
ì ì¬ì©í´ì¼ í©ëë¤.
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()
WeakMap
ê°ì²´ì key
ì value
를 ì°ê²°í©ëë¤. 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, "azerty");
wm2.set(o1, o2); // ê°ì í¨ìì ê°ì²´ë¥¼ í¬í¨í´ ì무거ë ê°ë¥
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // í¤ë ì무 ê°ì²´ë ê°ë¥. ë¤ë¥¸ WeakMapë ê°ë¥í©ëë¤!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, wm2ìë o2ì ì°ê²°ë ê°ì´ ìì
wm2.get(o3); // undefined, o3ì undefined를 ì°ê²°í¨
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (ê°ì´ undefinedì§ë§)
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;
}
}
ë¹ê³µê° ë©¤ë² íë´ë´ê¸°
WeakMap
ì ì¬ì©íë©´ ë¹ê³µê° ë°ì´í°ë¥¼ ê°ì²´ì ì°ê²°í ì ìê³ , ë¤ìê³¼ ê°ì ì´ì ì ë릴 ì ììµëë¤.
Map
ê³¼ ë¹êµíì ë, WeakMap
ì í¤ë¡ ì¬ì©ëë ê°ì²´ì ëí ê°ë ¥í 참조를 ë³´ì íì§ ìì¼ë¯ë¡ ê°ì²´ì ê·¸ ë©íë°ì´í°ê° ëì¼í ìëª
ì ê³µì íê³ , ë°ë¼ì ë©ëª¨ë¦¬ ëì를 ë°©ì§í ì ììµëë¤.Symbol
ìì±ì ì¬ì©íë ê²ê³¼ ë¹êµíì ë, WeakMap
ì ê°ì²´ ì¸ë¶ì ì¡´ì¬íë¯ë¡ Object.getOwnPropertySymbols
ë± ë¦¬íë ì
ë©ìë를 ì¬ì©íëë¼ë ì¬ì©ì ì½ëììë ë©íë°ì´í°ë¥¼ ê°ì ¸ì¬ ì ììµëë¤.WeakMap
ì ìì±ììì ìì±í 모ë ì¸ì¤í´ì¤ì ì¬ì¬ì©í ì ìì¼ë¯ë¡ ë©ëª¨ë¦¬ í¨ì¨ì±ì´ ë ëê³ , ê°ì í´ëì¤ì ë¤ë¥¸ ì¸ì¤í´ì¤ê° ìë¡ì ë¹ê³µê° 멤ë²ë¥¼ ì½ì ì ììµëë¤.let Thing;
{
const privateScope = new WeakMap();
let counter = 0;
Thing = function () {
this.someProperty = "foo";
privateScope.set(this, {
hidden: ++counter,
});
};
Thing.prototype.showPublic = function () {
return this.someProperty;
};
Thing.prototype.showPrivate = function () {
return privateScope.get(this).hidden;
};
}
console.log(typeof privateScope);
// "undefined"
const thing = new Thing();
console.log(thing);
// Thing {someProperty: "foo"}
thing.showPublic();
// "foo"
thing.showPrivate();
// 1
ì ì½ëë ë¹ê³µê° íë를 ì¬ì©íë ìë ìì ì ëì¼íë¤ê³ ë³¼ ì ììµëë¤.
class Thing {
static #counter = 0;
#hidden;
constructor() {
this.someProperty = "foo";
this.#hidden = ++Thing.#counter;
}
showPublic() {
return this.someProperty;
}
showPrivate() {
return this.#hidden;
}
}
console.log(thing);
// Thing {someProperty: "foo"}
thing.showPublic();
// "foo"
thing.showPrivate();
// 1
ë©íë°ì´í° ì°ê²°í기
WeakMap
ì ì¬ì©íë©´ ê°ì²´ì ìëª
주기ì ìí¥ì ì£¼ì§ ìê³ ë ë©íë°ì´í°ë¥¼ ì°ê²°í ì ììµëë¤. ë¹ê³µê° ë©¤ë² ìì íê³ ë êµì¥í ë¹ì·íë°, ë¹ê³µê° ë©¤ë² ëí íë¡í íì
ììì ì°¸ì¬íì§ ìë ì¸ë¶ ë©íë°ì´í°ë¡ ì¤ê³ë기 ë문ì
ëë¤.
íì§ë§ ì´ ë°©ë²ì ì´ë¯¸ ìì±ë ê°ì²´ë¤ì ëìì¼ë¡ë íì¥í ì ììµëë¤. ì를 ë¤ì´ ì¹ììë, DOM ììì ì¶ê° ë°ì´í°ë¥¼ ì°ê²°íë¤ê° ëì¤ì ì ê·¼íê³ ì¶ì ê²½ì°ê° ì길 ì ììµëë¤. íí ì°ì´ë ë°©ë²ì ë°ì´í°ë¥¼ ììì ìì±ì¼ë¡ ë¶ì´ë ê²ì ëë¤.
const buttons = document.querySelectorAll(".button");
buttons.forEach((button) => {
button.clicked = false;
button.addEventListener("click", () => {
button.clicked = true;
const currentButtons = [...document.querySelectorAll(".button")];
if (currentButtons.every((button) => button.clicked)) {
console.log("모ë ë²í¼ì í´ë¦íìµëë¤!");
}
});
});
ì ë°©ë²ë ëìíì§ë§, ëª ê°ì§ 문ì ê° ììµëë¤.
clicked
ìì±ì´ ì´ê±° ê°ë¥íë¯ë¡ Object.keys(button)
, for...in
ë°ë³µë¬¸ ë±ì ë
¸ì¶ë©ëë¤. Object.defineProperty()
를 ì¬ì©íë©´ ëìí ì ìì§ë§, ëì ì½ëê° ë ìëë¬ìì§ëë¤.clicked
ìì±ì ì¼ë° 문ìì´ ìì±ì´ë¯ë¡ ë¤ë¥¸ ì½ëìì ì ê·¼íê±°ë ë®ì´ì¸ ì ììµëë¤. Symbol
í¤ë¥¼ ì¬ì©í´ ëìí ì ìì§ë§, ê·¸ëë Object.getOwnPropertySymbols()
ë¡ ì ê·¼í ì ììµëë¤.WeakMap
ì ì¬ì©íë©´ 모ë ê³ ì¹ ì ììµëë¤.
const buttons = document.querySelectorAll(".button");
const clicked = new WeakMap();
buttons.forEach((button) => {
clicked.set(button, false);
button.addEventListener("click", () => {
clicked.set(button, true);
const currentButtons = [...document.querySelectorAll(".button")];
if (currentButtons.every((button) => clicked.get(button))) {
console.log("모ë ë²í¼ì í´ë¦íìµëë¤!");
}
});
});
ì¬ê¸°ìë clicked
ì ì ê·¼í ì ìë ì½ëë§ ê° ë²í¼ì í´ë¦ ìí를 ì ì ìì¼ë¯ë¡ ì¸ë¶ ì½ëë ì´ ìí를 ë°ê¿ ì ììµëë¤. ëí ë²í¼ì´ DOMìì ì ê±°ëë©´ ì°ê´ëë ë©íë°ì´í°ë ê°ë¹ì§ 컬ë í°ê° ìëì¼ë¡ ì 리í©ëë¤.
í¨ìì ì ë¬íë 매ê°ë³ìì ê·¸ í¨ìì 결과를 ì°ê´ì§ì¼ë©´, ê°ì 매ê°ë³ì를 ë¤ì ë°ìì ë í¨ì를 ë¤ì ì¤ííì§ ìê³ ìºìë 결과를 ë°íí ì ììµëë¤. ì´ ë°©ë²ì í¨ìê° ìì(ì¸ë¶ ê°ì²´ë¥¼ ì¡°ìíê±°ë, 기í ê´ì¸¡ ê°ë¥í ë¶ìì©ì ì ë°íì§ ìì)í ë ì ì©í©ëë¤.
const cache = new WeakMap();
function handleObjectValues(obj) {
if (cache.has(obj)) {
return cache.get(obj);
}
const result = Object.values(obj).map(heavyComputation);
cache.set(obj, result);
return result;
}
íì§ë§ í¨ìê° í ê°ì²´ë¥¼ ë°ì ëë§ ì¬ì©í ì ìë¤ë ì ì 주ìí´ì¼ í©ëë¤. ëí ì
ë ¥íë ê°ì²´ë¥¼ í¨ìì ë¤ì ì ë¬í ì¼ì´ ììí ìë¤ê³ í´ë, ê²°ê³¼ë ìºìì ê³ì ë¨ììê² ë©ëë¤. ë í¨ì¨ì ì¸ ë°©ë²ì Map
ê³¼ WeakRef
ê°ì²´ë¥¼ ì¬ì©í´ì, ìì íì
ì ì
ë ¥ ê°ì ê·¸ì ëìíë (ìë§ë ë§¤ì° í°) ê³ì° ê²°ê³¼ì ì°ê´ì§ë ê²ì
ëë¤. ìì¸í ë´ì©ì WeakRefì FinalizationRegistry ìì 를 ì°¸ê³ íì¸ì.
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