WeakMap
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itโs been available across browsers since โจ2015๋ 7์โฉ.
* Some parts of this feature may have varying levels of support.
WeakMap
์ ํค/๊ฐ ์์ ๋ชจ์์ผ๋ก, ํค๋ ๋ฐ๋์ ๊ฐ์ฒด ๋๋ ๋ฑ๋ก๋์ง ์์ ์ฌ๋ณผ์ด๋ฉฐ ๊ฐ์ ์์์ JavaScript ํ์
์
๋๋ค. WeakMap
์ ํค์ ๋ํ ๊ฐ๋ ฅํ ์ฐธ์กฐ๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก, ๊ฐ์ฒด๊ฐ WeakMap
์ ํค์ ํฌํจ๋๋๋ผ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋์์ด ๋ฉ๋๋ค. ํค ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์ ๋ฆฌ๋ ํ์๋, ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ ฅํ ์ฐธ์กฐ๊ฐ ์กด์ฌํ์ง ์๋ ํ, ํค์ ์ฐ๊ฒฐ๋๋ ๊ฐ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์
๋์์ด ๋ฉ๋๋ค. WeakMap
์ ํค๋ก ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ์์ ๊ฐ์ ์ฌ๋ณผ, ์ ํํ๋ ๋ฑ๋ก๋์ง ์์ ์ฌ๋ณผ์ธ๋ฐ, ๋ฑ๋ก๋์ง ์์ ์ฌ๋ณผ์ ๊ณ ์ ํจ์ด ๋ณด์ฅ๋๋ฉฐ ๋ค์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
WeakMap
์ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ํค๋ฅผ ์ฐธ์กฐํ๋๋ผ๋ ํค ๊ฐ์ฒด์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋ฐฉ์งํ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ WeakMap
์ ํค์ ํ์ฑ ์ํ๋ฅผ ๊ด์ฐฐํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ผ๋ฉฐ, ์ด๋ WeakMap
์ ํค๋ฅผ ์ด๊ฑฐํ ์ ์๋ ์ด์ ์
๋๋ค. ๋ง์ฝ WeakMap
์ด ํค ๋ชฉ๋ก์ ์ป์ ์ ์๋ ์ด๋ค ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค๋ฉด, ๊ทธ ๋ชฉ๋ก์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ๊ฒ์ด๋ฏ๋ก ๋น๊ฒฐ์ ์ฑ์ด ๋ฐ์ํฉ๋๋ค. ํค ๋ชฉ๋ก์ด ํ์ํ๋ฉด WeakMap
๋์ Map
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํค ๊ธฐ๋ฐ ์ปฌ๋ ์
์๋ด์์ WeakMap ๊ฐ์ฒด ๊ตฌํ์์ 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
๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์์
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 ์์ ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ช ์ธ์
Specification |
---|
ECMAScriptยฎ 2026 Language Specification # sec-weakmap-objects |
๋ธ๋ผ์ฐ์ ํธํ์ฑ
Loadingโฆ