WeakSet
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
WeakSet æ¯å¯è¢«åå¾åæ¶çå¼çéåï¼å
æ¬å¯¹è±¡åéå
¨å±æ³¨åç符å·ãWeakSet ä¸çå¼åªè½åºç°ä¸æ¬¡ãå®å¨ WeakSet çéå䏿¯å¯ä¸çã
æè¿°
WeakSet ä¸çå¼ä¸å®æ¯å¯è¢«åå¾åæ¶çå¼ã大夿°åå§æ°æ®ç±»åå¯ä»¥è¢«ä»»æå°å建ï¼å¹¶ä¸æ²¡æçå½å¨æï¼æä»¥å®ä»¬ä¸è½è¢«åå¨ã对象åéå ¨å±æ³¨åç符å·å¯ä»¥è¢«åå¨ï¼å 为å®ä»¬æ¯å¯è¢«åå¾åæ¶çå¼ã
å®å Set 对象ç主è¦åºå«æï¼
-
WeakSetåªè½æ¯å¯¹è±¡å符å·çéåï¼å®ä¸è½åSet飿 ·å å«ä»»ä½ç±»åçä»»æå¼ã -
WeakSetæå¼±å¼ç¨ï¼WeakSetä¸å¯¹è±¡çå¼ç¨ä¸ºå¼±å¼ç¨ãå¦ææ²¡æå ¶ä»ç对WeakSetä¸å¯¹è±¡çå¼ç¨åå¨ï¼é£ä¹è¿äºå¯¹è±¡ä¼è¢«åå¾åæ¶ã夿³¨ï¼è¿ä¹æå³çéå䏿²¡æåå¨å½åå¼çå表ã
WeakSetæ¯ä¸å¯æä¸¾çã
ç¨ä¾ï¼æ£æµå¾ªç¯å¼ç¨
éå½è°ç¨èªèº«ç彿°éè¦ä¸ç§éè¿è·è¸ªåªäºå¯¹è±¡å·²è¢«å¤çï¼æ¥åºå¯¹å¾ªç¯æ°æ®ç»æçæ¹æ³ã
为æ¤ï¼WeakSet é常éåå¤çè¿ç§æ
åµï¼
// å¯¹ä¼ å
¥ç subject 对象å
é¨åå¨çææå
容æ§è¡åè°
function execRecursively(fn, subject, _refs = new WeakSet()) {
// é¿å
æ ééå½
if (_refs.has(subject)) {
return;
}
fn(subject);
if (typeof subject === "object") {
_refs.add(subject);
for (const key in subject) {
execRecursively(fn, subject[key], _refs);
}
}
}
const foo = {
foo: "Foo",
bar: {
bar: "Bar",
},
};
foo.bar.baz = foo; // 循ç¯å¼ç¨ï¼
execRecursively((obj) => console.log(obj), foo);
卿¤ï¼å¨ç¬¬ä¸æ¬¡è¿è¡æ¶å建 WeakSetï¼å¹¶å°å
¶ä¸æ¯ä¸ªåç»å½æ°è°ç¨ä¸èµ·ä¼ éï¼ä½¿ç¨å
é¨åæ° _refsï¼ã
å¯¹è±¡çæ°éæå®ä»¬çéåé¡ºåºæ å
³ç´§è¦ï¼å æ¤ï¼WeakSet æ¯ Set æ´éåï¼åæ§è¡ï¼è·è¸ªå¯¹è±¡å¼ç¨ï¼å°¤å
¶æ¯å¨æ¶å大é对象æ¶ã
æé 彿°
WeakSet()-
å建ä¸ä¸ªæ°ç
WeakSet对象ã
å®ä¾å±æ§
è¿äºå±æ§å¨ WeakSet.prototype ä¸å®ä¹ï¼å¹¶ä¸ç±ææ WeakSet å®ä¾æå
±äº«ã
WeakSet.prototype.constructor-
å建äºè¯¥å®ä¾å¯¹è±¡çæé 彿°ã对äº
WeakSetå®ä¾ï¼åå§å¼æ¯WeakSetæé 彿°ã WeakSet.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"WeakSet"ãè¯¥å±æ§è¢«Object.prototype.toString()æä½¿ç¨ã
å®ä¾æ¹æ³
WeakSet.prototype.add()-
å°
value追å å°WeakSet对象ã WeakSet.prototype.delete()-
ä»
WeakSetä¸ç§»é¤valueãæ¤åè°ç¨WeakSet.prototype.has(value)å°è¿åfalseã WeakSet.prototype.has()-
è¿åä¸ä¸ªè¡¨ç¤º
valueæ¯å¦åå¨äºWeakSet对象ä¸çå¸å°å¼ã
示ä¾
>ä½¿ç¨ WeakSet 对象
const ws = new WeakSet();
const foo = {};
const bar = {};
ws.add(foo);
ws.add(bar);
ws.has(foo); // true
ws.has(bar); // true
ws.delete(foo); // ä» set ä¸å é¤ foo 对象
ws.has(foo); // falseï¼foo 对象已ç»è¢«å é¤äº
ws.has(bar); // trueï¼bar ä¾ç¶åå¨
注æï¼foo !== barã尽管å®ä»¬æ¯ç¸ä¼¼ç对象ï¼ä½æ¯å®ä»¬ä¸æ¯åä¸ä¸ªå¯¹è±¡ãå æ¤ï¼å®ä»¬é½å¯ä»¥è¢«å å
¥å°éåä¸ã
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-weakset-objects> |