åºå±è¯è¨ï¼å¦ C è¯è¨ï¼æ¥ææå¨çå
å管çåè¯ï¼ä¾å¦ï¼malloc()
å free()
ãç¸åï¼JavaScript æ¯å¨å建对象æ¶èªå¨åé
å
åï¼å¹¶å¨ä¸åä½¿ç¨æ¶èªå¨éæ¾å
åï¼åå¾åæ¶ï¼ãè¿ä¸ªèªå¨æ§æ¯æ··ä¹±çæ½å¨æ ¹æºï¼å®è®©å¼åè
é误å°ä»¥ä¸ºä»ä»¬ä¸éè¦æ
å¿å
å管çã
ä¸ç®¡ä»ä¹ç¨åºè¯è¨ï¼å åçå½å¨æåºæ¬æ¯ä¸è´çï¼
卿æè¯è¨ä¸ï¼ç¬¬äºç¹é½æ¯æ¾å¼çãå¨åºå±è¯è¨ä¸ï¼ç¬¬ä¸ç¹å第ä¸ç¹æ¯æ¾å¼çï¼ä½å¨é«çº§è¯è¨ä¸ï¼å¦ JavaScriptï¼ï¼å¤§å¤æ°æ¯éå¼çã
JavaScript çå ååé å¼çåå§å为äºä¸è®©ç¨åºåè´¹å¿å ååé ï¼JavaScript å¨å¼åæ¬¡å£°ææ¶èªå¨åé å åã
const n = 123; // 为æ°å¼åé
å
å
const s = "azerty"; // 为å符串åé
å
å
const o = {
a: 1,
b: null,
}; // 为对象åå
¶å
å«çå¼åé
å
å
// 为æ°ç»åå
¶å
å«çå¼åé
å
åï¼å°±åå¯¹è±¡ä¸æ ·ï¼
const a = [1, null, "abra"];
function f(a) {
return a + 2;
} // ä¸ºå½æ°ï¼å¯è°ç¨ç对象ï¼åé
å
å
// 彿°è¡¨è¾¾å¼ä¹ä¼åé
å
å
someElement.addEventListener(
"click",
function () {
someElement.style.backgroundColor = "blue";
},
false,
);
éè¿å½æ°è°ç¨åé
å
å
æäºå½æ°è°ç¨çç»ææ¯ä¸ºå¯¹è±¡åé å åï¼
const d = new Date(); // 为 Date 对象åé
å
å
const e = document.createElement("div"); // 为 DOM å
ç´ åé
å
å
æäºæ¹æ³ä¸ºæ°å¼ææ°å¯¹è±¡åé å åï¼
const s = "azerty";
const s2 = s.substr(0, 3); // s2 æ¯ä¸ä¸ªæ°çå符串
// å 为å符串æ¯ä¸å¯åçå¼ï¼
// JavaScript å¯è½å³å®ä¸åé
å
åï¼
// åªæ¯åå¨äº [0-3] çèå´ã
const a = ["yeah yeah", "no no"];
const a2 = ["generation", "no no"];
const a3 = a.concat(a2);
// æå个å
ç´ çæ°æ°ç»ï¼ç± a å a2 å
¶ä¸çå
ç´ è¿æ¥èæã
使ç¨å¼
使ç¨å¼åºæ¬ä¸æ¯æå¨åé çå åä¸è¿è¡è¯»åã读ååéå¼æå¯¹è±¡ç屿§å¼ï¼çè³ç»å½æ°ä¼ éåæ°é½ä¼ä½¿ç¨å¼ã
å½å åä¸åéè¦ä½¿ç¨æ¶éæ¾å¤§å¤æ°å å管ççé®é¢åºç°å¨è¿ä¸ªé¶æ®µãè¿ä¸ªé¶æ®µæé¾ç任塿¯ç¡®å®å·²åé çå å使¶ä¸åéè¦äºã
åºå±è¯è¨è¦æ±å¼å人åæå¨ç¡®å®å¨ç¨åºçåªä¸ªç¹ä¸åéè¦å·²åé çå åå¹¶éæ¾è¿åå åã
ä¸äºé«çº§è¯è¨ï¼å¦ JavaScriptï¼ä½¿ç¨çæ¯èªå¨å å管çï¼ä¹å°±æ¯åå¾åæ¶ï¼GCï¼ï¼çå½¢å¼ãåå¾åæ¶å¨çç®çæ¯çæ§å ååé åç¡®å®ä¸åå·²åé çå å使¶ä¸åéè¦å¹¶éæ¾è¿åå åãè¿ä¸ªèªå¨è¿ç¨æ¯ä¸ªè¿ä¼¼ç说æ³ï¼å 为确å®ä¸åç¹å®çå 忝å¦ä»ç¶éè¦è¿ä¸ªä¸è¬æ§é®é¢æ¯æ æ³å¤å®çã
åå¾åæ¶å¦ä¸ææè¿°ï¼èªå¨å¯»æ¾ä¸äºå 忝å¦âä¸åéè¦âè¿ä¸ªä¸è¬æ§é®é¢æ¯æ æ³å¤å®çãå æ¤ï¼åå¾åæ¶å¨å¯¹è¿ä¸ªä¸è¬æ§é®é¢å®ç°äºä¸ä¸ªåå¨éå¶çè§£å³æ¹æ¡ãæ¬èå°è§£éç解主è¦çåå¾åæ¶ç®æ³åå ¶å¯¹åºçå±éæå¿ é¡»çæ¦å¿µã
å¼ç¨åå¾åæ¶ç®æ³ä¾èµçä¸»è¦æ¦å¿µæ¯å¼ç¨ãå¨å å管ççä¸ä¸æä¸ï¼å¦æä¸ä¸ªå¯¹è±¡æè®¿é®å¦ä¸ä¸ªå¯¹è±¡çæéï¼éå¼æè æ¾å¼ï¼ï¼ç§°ä½åé¢ç对象å¼ç¨åé¢ç对象ãä¾å¦ï¼ä¸ä¸ª JavaScript å¯¹è±¡å ·æå¯¹å®çååçå¼ç¨ï¼éå¼å¼ç¨ï¼å对å®å±æ§çå¼ç¨ï¼æ¾å¼å¼ç¨ï¼ã
å¨è¿ä¸ªä¸ä¸æä¸ï¼â对象âçæ¦å¿µä¸ä» æå¸¸è§ç JavaScript 对象ï¼è¿å æ¬å½æ°ä½ç¨åï¼æè å ¨å±è¯æ³ä½ç¨åï¼ã
å¼ç¨è®¡æ°åå¾åæ¶å¤æ³¨ï¼ ç°ä»£ JavaScript 弿ä¸å使ç¨å¼ç¨è®¡æ°è¿è¡åå¾åæ¶ã
è¿æ¯æå级çåå¾åæ¶ç®æ³ãæ¤ç®æ³æç¡®å®å¯¹è±¡æ¯å¦ä»ç¶éè¦è¿ä¸ªé®é¢ç®å为确å®å¯¹è±¡æ¯å¦ä»æå ¶ä»å¼ç¨å®ç对象ãå¦ææ²¡ææå该对象çå¼ç¨ï¼é£ä¹è¯¥å¯¹è±¡ç§°ä½âåå¾âæè å¯åæ¶çã
示ä¾
let x = {
a: {
b: 2,
},
};
// å建äºä¸¤ä¸ªå¯¹è±¡ãä¸ä¸ªä½ä¸ºå¦ä¸ä¸ªç屿§è¢«å¼ç¨ã
// å¦ä¸ä¸ªè¢«èµå¼ç»åéâxâã
// 徿¾ç¶ï¼æ²¡æå¯ä»¥è¢«åå¾åæ¶ç对象ã
let y = x;
// åéâyâæ¯ç¬¬äºä¸ªæ¥æå¯¹è±¡å¼ç¨çåéã
x = 1;
// ç°å¨ï¼èµ·åå¨âxâä¸ç对象æå¯ä¸çå¼ç¨ï¼å°±æ¯åéâyâã
let z = y.a;
// å¼ç¨å¯¹è±¡çâaâ屿§ã
// ç°å¨ï¼è¿ä¸ªå¯¹è±¡æä¸¤ä¸ªå¼ç¨ï¼ä¸ä¸ªä½ä¸ºå±æ§ï¼
// å¦ä¸ä¸ªä½ä¸ºåéâzâã
y = "mozilla";
// èµ·åå¨âxâä¸ç对象ç°å¨æ¯é¶å¼ç¨äºãå®å¯ä»¥è¢«åå¾åæ¶äºã
// 使¯ï¼å®ç屿§âaâä»è¢«åéâzâå¼ç¨ï¼æä»¥è¿ä¸ªå¯¹è±¡è¿ä¸è½åæ¶ã
z = null;
// èµ·åå¨ x ä¸ç对象ç屿§âaâæ¯é¶å¼ç¨äºãè¿ä¸ªå¯¹è±¡å¯ä»¥è¢«åå¾åæ¶äºã
循ç¯å¼ç¨æ¯ä¸ä¸ªéå¶ãå¨ä¸é¢çä¾åä¸ï¼å建äºä¸¤ä¸ªå¯¹è±¡ï¼ä¸ä¸ªå¯¹è±¡ç屿§å¼ç¨å¦ä¸ä¸ªå¯¹è±¡ï¼å½¢æäºä¸ä¸ªå¾ªç¯ãå¨å½æ°è°ç¨ç»æä¹åï¼å®ä»¬ç¦»å¼äºå½æ°ä½ç¨åãå¨é£ä¸ªç¹ï¼å®ä»¬ä¸å被éè¦äºï¼ä¸ºå®ä»¬åé çå ååºè¯¥è¢«åæ¶ãç¶èï¼å¼ç¨è®¡æ°ç®æ³ä¸ä¼è®¤ä¸ºå®ä»¬å¯ä»¥è¢«åæ¶ï¼å 为æ¯ä¸ªå¯¹è±¡è³å°è¿æä¸ä¸ªæåèªå·±çå¼ç¨ï¼è¿æ ·çç»æå°±æ¯å®ä»¬ä¸¤ä¸ªé½ä¸ä¼è¢«æ 记为å¯ä»¥è¢«åå¾åæ¶ã循ç¯å¼ç¨æ¯å åæ³é²ç常è§åå ã
function f() {
const x = {};
const y = {};
x.a = y; // x å¼ç¨ y
y.a = x; // y å¼ç¨ x
return "azerty";
}
f();
æ è®°æ¸
é¤ç®æ³
è¿ä¸ªç®æ³å°â对象ä¸åéè¦âè¿ä¸ªå®ä¹ç®å为â对象ä¸å¯è¾¾âã
è¿ä¸ªç®æ³å宿ä¸ç»å«åæ ¹ç对象ãå¨ JavaScript ä¸ï¼æ ¹æ¯å ¨å±å¯¹è±¡ãåå¾åæ¶å¨å°å®æä»è¿äºæ ¹å¼å§ï¼æ¾å°ä»è¿äºæ ¹è½å¼ç¨å°çææå¯¹è±¡ï¼ç¶åæ¾å°ä»è¿äºå¯¹è±¡è½å¼ç¨å°çææå¯¹è±¡ï¼ççã仿 ¹å¼å§ï¼åå¾åæ¶å¨å°æ¾å°ææå¯å°è¾¾ç对象并æ¶éææä¸è½å°è¾¾ç对象ã
è¿ä¸ªç®æ³æ¯å¯¹ä¸ä¸ä¸ªç®æ³çæ¹è¿ãå 为对äºå¼ç¨è®¡æ°ç®æ³ï¼æé¶å¼ç¨ç对象å®é 䏿¯ä¸å¯è¾¾çï¼ä½æ¯æå¼ç¨ç对象å´ä¸ä¸å®ï¼å°±åå¨å¾ªç¯å¼ç¨ä¸çå°ç飿 ·ã
å½åï¼ææç°ä»£ç弿æè½½çæ¯æ è®°æ¸ é¤åå¾åæ¶å¨ãè¿å»å å¹´ä¸ï¼å¨ JavaScript åå¾åæ¶é¢åååºçæ¹è¿ï¼å代/å¢é/å¹¶å/å¹¶è¡åå¾åæ¶ï¼é½æ¯è¿ä¸ªç®æ³çå®ç°æ¹è¿ï¼è䏿¯åå¾åæ¶ç®æ³æ¬èº«çæ¹è¿ï¼ä¹ä¸æ¯ä½æ¶â对象ä¸åéè¦âè¿ä¸ªå®ä¹çç®åã
è¿ä¸ªæ¹æ³çç´æ¥å¥½å¤å°±æ¯å¾ªç¯ä¸åæ¯ä¸ä¸ªé®é¢ãå¨ä¸é¢ç示ä¾ä¸ï¼å¨å½æ°è°ç¨è¿åä¹åï¼ä»å ¨å±å¯¹è±¡å¯è¾¾çä»»ä½èµæºé½å°ä¸åå¼ç¨è¿ä¸¤ä¸ªå¯¹è±¡ãå æ¤ï¼åå¾åæ¶å¨ä¼è®¤ä¸ºå®ä»¬ä¸å¯è¾¾å¹¶åæ¶ä¸ºå®ä»¬åé çå åã
ç¶èï¼æå¨æ§å¶åå¾åæ¶çè½åä»ä¸åå¨ãææ¶åæå¨å³å®ä½æ¶éæ¾å å以åéæ¾åªåå åä¼å¾æ¹ä¾¿ã为äºéæ¾å¯¹è±¡çå åï¼éè¦æ¾å¼å°åæä¸å¯è¾¾ãå¨ JavaScript ä¸ï¼ç¼ç¨å¼å°è§¦ååå¾åæ¶ä¹ä¸å¯è½ââæ°¸ä¸å¯è½åºç°å¨æ ¸å¿è¯è¨ä¸ï¼å°½ç®¡å¼æå¯è½å¨å¯éçæ å¿ä¸æ´é²äºç¸å ³ç APIã
é ç½®å¼æçå 忍¡åJavaScript å¼æå ¸åå°æä¾äºæ´é²å 忍¡åçæ å¿ãä¾å¦ï¼Node.js 为é ç½®åè°è¯å åé®é¢æä¾äºæ´é²åºå±ç V8 æºå¶çé¢å¤é项åå·¥å ·ãè¿ä¸ªé ç½®å¯è½å¨æµè§å¨ä¸ä¸è½ä½¿ç¨ï¼Web 页颿´ä¸ç¨è¯´ï¼éè¿ HTTP æ 头ï¼ççï¼ã
æå¤§å¯ç¨å å åå¯ä»¥éè¿ä½¿ç¨æ å¿æ¥å¢å ï¼
node --max-old-space-size=6000 index.js
ä½¿ç¨æ å¿å Chrome è°è¯å¨ ä¹è½ä¸ºè°è¯å åé®é¢æ´é²åå¾åæ¶å¨ï¼
node --expose-gc --inspect index.js
帮å©å
å管ççæ°æ®ç»æ
尽管 JavaScript 没æç´æ¥æ´é²åå¾åæ¶å¨ APIãä½è¯è¨æä¾å ä¸ªé´æ¥è§å¯åå¾åæ¶çæ°æ®ç»æï¼è½ç¨äºå å管çã
WeakMap å WeakSetWeakMap
å WeakSet
ç API å ä¹éåé weak ççï¼Map
å Set
ãWeakMap
ç»´æ¤ä¸ä¸ªé® - å¼å¯¹çéåï¼è WeakSet
ç»´æ¤ä¸ä¸ªå¯ä¸å¼çéåï¼ä¸¤è
é½è½é«æçæ·»å ãå é¤åæ¥è¯¢ã
WeakMap
å WeakSet
çå忥æºäºå¼±å¼ç¨å¼çæ¦å¿µãå设 x
被 y
å¼±å¼ç¨ï¼è¿æå³çå°½ç®¡ä½ è½éè¿ y
è®¿é® x
çå¼ï¼ä½å¦æ x
ä¸å被强å¼ç¨çè¯ï¼æ è®°æ¸
é¤ç®æ³ä¸ä¼è®¤ä¸º x
æ¯å¯è¾¾çã大夿°æ°æ®ç»æï¼é¤äºå¨è¿è®¨è®ºçè¿ä¸¤ä¸ªï¼é½æ¯å¼ºå¼ç¨ä¼ å
¥ç对象ï¼è¿æ ·ä½ æè½å¨ä»»ææ¶é´ååè¿äºå¯¹è±¡ãåªè¦ç¨åºä¸ä¸åæé®çå¼ç¨ï¼WeakMap
å WeakSet
çé®è½è¢«åå¾åæ¶ï¼å¯¹ WeakMap
对象ï¼å¼æ¥çä¹éåè¢«åæ¶ï¼ãè¿ä¸ç¹ç±ä¸¤ä¸ªç¹æ§ç¡®ä¿ï¼
WeakMap
å WeakSet
ä»
è½åå¨å¯¹è±¡æ symbolãè¿æ¯å 为ä»
对象æ¯å¯åå¾åæ¶çââåå§å¼æ»æ¯è¢«å¤å¶çï¼ä¹å°±æ¯ï¼1 === 1
ä½ {} !== {}
ï¼ï¼è¿è®©åå§å¼æ°¸è¿åå¨éåä¸ã已注åç symbolï¼å¦ Symbol.for("key")
ï¼ä¹æ¯è¢«å¤å¶ï¼å æ¤ä¹ä¸æ¯å¯åå¾åæ¶çï¼ä½æ¯ç¨ Symbol("key")
å建ç symbol æ¯å¯åå¾åæ¶çãå
ç½®éç¨ symbolï¼å¦ Symbol.iterator
ï¼æ¥èªäºä¸ç»åºå®çéåï¼å¨ç¨åºçæ´ä¸ªå£°æå¨æä¸æ¯å¯ä¸çï¼ç±»ä¼¼äºåºæå¯¹è±¡ï¼å¦ Array.prototype
ï¼ï¼æä»¥å®ä»¬ä¹è½ä½ä¸ºé®ãWeakMap
å WeakSet
æ¯ä¸å¯è¿ä»£çãè¿ç¦æ¢ä½ ä½¿ç¨ Array.from(map.keys()).length
è§å¯å¯¹è±¡çåæ´»æ§æè·åä»»æéååå¾åæ¶çé®çå¼ç¨ï¼åå¾åæ¶åºå°½å¯è½ä¸å¯è§ï¼ãå¨å
¸åç WeakMap
å WeakSet
çè§£éä¸ï¼å°±åä¸é¢é£æ ·ï¼ï¼é常æç¤ºï¼é®é¦å
被åå¾åæ¶ï¼ç¶åå¼ä¹è¢«åå¾åæ¶ãç¶èï¼èèå¼å¼ç¨é®è¿ä¸ªä¾åï¼
const wm = new WeakMap();
const key = {};
wm.set(key, { key });
// ç°å¨ `key` ä¸è½è¢«åå¾åæ¶ï¼
// å 为å¼å¼ç¨äºé®ï¼
// å¹¶ä¸å¼å¨ map 䏿¯å¼ºå¼ç¨ï¼
å设 key
åå¨ä¸ºçå®çå¼ç¨ï¼å®å°å建ä¸ä¸ªå¾ªç¯å¼ç¨ï¼è®©é®åå¼é½ä¸éååå¾åæ¶ï¼å³ä½¿å¨ key
没æè¢«å¼ç¨æ¶ââå 为å设 key
被åå¾åæ¶äºï¼è¿æå³çå¨æä¸ªç¹å®çæ¶å»ï¼value.key
å°æåä¸ä¸ªä¸åå¨çå°åï¼èè¿æ¯éæ³çã为äºä¿®å¤è¿ä¸ªï¼WeakMap
å WeakSet
çæ¡ç®ä¸æ¯çæ£çå¼ç¨ï¼èæ¯ä¸´æ¶å¯¹è±¡ï¼å¯¹æ è®°æ¸
餿ºå¶çå¢å¼ºï¼ãBarros çäººå¯¹ç®æ³æä¾äºä¸ä¸ªå¾å¥½çæ»ç»ï¼ç¬¬ 4 页ï¼ãå¼ç¨ä¸æ®µï¼
临æ¶å¯¹è±¡æ¯ weak pairs çæ¹è¿ï¼å¨ pairs ä¸ï¼é®åå¼é½ä¸å类为弱æå¼ºãé®çè¿æ¥æ§å³å®äºå¼çè¿æ¥æ§ï¼ä½å¼çè¿æ¥æ§ä¸ä¼å½±åé®çè¿æ¥æ§ã[...]å½åå¾åæ¶æä¾ä¸´æ¶å¯¹è±¡çæ¯ææ¶ï¼å®ä¼åºç°ä¸ä¸ªé¶æ®µè䏿¯ä¸¤ä¸ªï¼æ è®°åæ¸ é¤ï¼ã
ä½ä¸ºä¸ä¸ªç²ç³ä½èµ°å¿ç模åï¼å°ä¸åçå®ç°å½ä½ WeakMap
çå®ç°ï¼
è¦åï¼ è¿ä¸æ¯ polyfillï¼ä¹ä¸æ¥è¿å¼æä¸çå®ç°ï¼å¼æä¸çå®ç° hook è¿äºåå¾åæ¶æºå¶ï¼ã
class MyWeakMap {
#marker = Symbol("MyWeakMapData");
get(key) {
return key[this.#marker];
}
set(key, value) {
key[this.#marker] = value;
}
has(key) {
return this.#marker in key;
}
delete(key) {
delete key[this.#marker];
}
}
æ£å¦ä½ æçå°çï¼MyWeakMap
å®é
䏿°¸è¿æ²¡æä¿åä¸ä¸ªé®éåãå®ç®åå°å°å
æ°æ®æ·»å å°ä¼ å
¥çæ¯ä¸ªå¯¹è±¡ä¸ã对象æ¥çéè¿æ è®°æ¸
é¤è¢«åå¾åæ¶ãå æ¤ï¼å¨ WeakMap
ä¸è¿è¡è¿ä»£æ¯ä¸å¯è½çï¼æ¸
é¤ WeakMap
乿¯ä¸å¯è½çï¼å 为é£ä¹ä¾èµäºå®æ´çé®éåä¿¡æ¯ï¼ã
æ´å¤æå ³å®ä»¬ç API çä¿¡æ¯ï¼åè§å¸¦é®çéåæåã
WeakRefs å FinalizationRegistry夿³¨ï¼ WeakRef
å FinalizationRegistry
è½ç´æ¥å
çè¿åå¾åæ¶æºå¶ãå°½éé¿å
使ç¨ï¼å 为è¿è¡æ¶è¯ä¹å ä¹å®å
¨ä¸åä¿è¯ã
ææç¨å¯¹è±¡ä½ä¸ºå¼çåé齿¯é£ä¸ªå¯¹è±¡çå¼ç¨ãç¶èï¼è¿æ ·çå¼ç¨æ¯å¼ºå¼ç¨ââå®ä»¬çåå¨ä¼é»æ¢åå¾åæ¶å¨å°å¯¹è±¡æ 记为éååæ¶ãWeakRef
æ¯å¯¹è±¡çå¼±å¼ç¨ï¼è¿è®©å¯¹è±¡è½è¢«åå¾åæ¶ï¼åæ¶å¨å¯¹è±¡ç声æå¨ææé´ä»ä¿çäºè¯»å对象çå
容çè½åã
ä¸ä¸ª WeakRef
ç¨ä¾æ¯å°å符串 URL æ å°ä¸ºå¤§å¯¹è±¡çç¼åç³»ç»ãè¿ä¸ªç¼åç³»ç»æä»¬ä¸è½ä½¿ç¨ WeakMap
ãå 为 WeakMap
对象ç鮿¯å¼±å¼ç¨çï¼è䏿¯å¼ââå¦æä½ è®¿é®é®ï¼ä½ å°æ»æ¯ç¡®å®å°å¾å°å¼ï¼å 为è½è®¿é®é®æå³çé®ä»ç¶ææï¼ãè¿éï¼ä»é®å¾å°çæ¯ undefined
æ¯æ²¡é®é¢çï¼å¦æå¯¹åºçå¼ä¸åææï¼ï¼å 为æä»¬åªéè¦éæ°è®¡ç®ï¼ä½æ¯æä»¬ä¸æ³è®©ä¸å¯è¾¾ç对象åå¨ç¼åä¸ãå¨è¿ä¸ªä¾åä¸ï¼æä»¬ä½¿ç¨æ®éç Map
ï¼ä½æ¯å¼ä½¿ç¨ WeakRef
对象ï¼è䏿¯çæ£ç对象å¼ã
function cached(getter) {
// ä¸ä¸ª Mapï¼ä»å符串 URL å° WeakRef ç»æ
const cache = new Map();
return async (key) => {
if (cache.has(key)) {
const dereferencedValue = cache.get(key).deref();
if (dereferencedValue !== undefined) {
return dereferencedValue;
}
}
const value = await getter(key);
cache.set(key, new WeakRef(value));
return value;
};
}
const getImage = cached((url) => fetch(url).then((res) => res.blob()));
FinalizationRegistry
æä¾äºä¸ä¸ªæ´å¼ºçæºå¶è§å¯åå¾åæ¶ãå®è®©ä½ 注å对象以å对象被åå¾åæ¶æ¶å¾å°éç¥ãä¾å¦ï¼å¯¹äºä¸é¢çç¼åç³»ç»è¿ä¸ªä¾åï¼å³ä½¿å¨ blob èªèº«è¢«åå¾åæ¶æ¶ï¼å¼ç¨ blob ç WeakRef
对象ä¸ä¼è¢«åå¾åæ¶ââéçæ¶é´ç积累ï¼Map
å¯è½ç§¯è大éçæ ç¨æ¡ç®ãå¨è¿éçä¾åä¸ï¼ä½¿ç¨ FinalizationRegistry
è½æ§è¡æ¸
é¤ã
function cached(getter) {
// ä¸ä¸ª Mapï¼ä»å符串 URL å° WeakRef ç»æ
const cache = new Map();
// æ¯æ¬¡å¼è¢«åå¾åæ¶ä¹åï¼ç¨ç¼åä¸ç key ä½ä¸ºåæ°è°ç¨åè°ï¼è½ç§»é¤ç¼åæ¡ç®
const registry = new FinalizationRegistry((key) => {
// 注æï¼æµè¯ WeakRef çç为空å¾éè¦ãå¦åï¼åè°å¯è½å¨ç¨è¿ä¸ª key æ·»å æ°å¯¹è±¡ä¹åè°ç¨ï¼ç¶åé£ä¸ªæ°çãææç对象就被å é¤äº
if (!cache.get(key)?.deref()) {
cache.delete(key);
}
});
return async (key) => {
if (cache.has(key)) {
return cache.get(key).deref();
}
const value = await getter(key);
cache.set(key, new WeakRef(value));
registry.register(value, key);
return value;
};
}
const getImage = cached((url) => fetch(url).then((res) => res.blob()));
åºäºæ§è½åå®å
¨èèï¼ä¸ä¼ä¿è¯ä½æ¶è°ç¨åè°ï¼æè
æ¯å¦ä¼è°ç¨ãå®åºè¯¥ä»
ç¨äºæ¸
é¤ââéå
³é®çæ¸
é¤ãæå
¶ä»æ´ç¡®å®çèµæºç®¡ççæ¹å¼ï¼ä¾å¦ try...finally
ï¼æ»æ¯ä¼æ§è¡ finally
åãWeakRef
å FinalizationRegistry
ä»
ç¨äºé¿æ¶é´è¿è¡çç¨åºä¸çå
åç¨éä¼åã
æ´å¤æå
³ WeakRef
å FinalizationRegistry
ç API çä¿¡æ¯ï¼åè§å¯¹åºçåè页é¢ã
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