C è¨èªã®ãããªä½æ°´æºè¨èªã«ã¯ãmalloc()
ã free()
ã®ãããªä½æ°´æºã®ã¡ã¢ãªã¼ç®¡çããªããã£ããããã¾ããããã«å¯¾ã㦠JavaScript ã§ã¯ããªãã¸ã§ã¯ãã使ããã¨ãã«ã¡ã¢ãªã¼ãèªåçã«ç¢ºä¿ãã使ç¨ããªããªã£ããã¡ã¢ãªã¼ãè§£æ¾ãã¾ãï¼ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ï¼ããã®èªåæ§ãæ··ä¹±ã®å
ã«ãªãå¯è½æ§ãããã¾ããã¡ã¢ãªã¼ç®¡çã«ã¤ãã¦å¿é
ããå¿
è¦ããªãã¨ãã誤ã£ãå°è±¡ãéçºè
ã«ä¸ããå¯è½æ§ãããã¾ãã
ããã°ã©ãã³ã°è¨èªã«é¢ä¿ãªããã¡ã¢ãªã¼ã®ã©ã¤ããµã¤ã¯ã«ã¯ã»ã¼ãã¤ãåãã§ãã
2 ã«é¢ãã¦ã¯ãã¹ã¦ã®è¨èªã§æç¤ºçã«è¡ããã¾ãã1 㨠3 ã¯ä½æ°´æºã®è¨èªã§ã¯æç¤ºçã§ãããJavaScript ã®ãããªé«æ°´æºè¨èªã§ã¯ãã»ã¨ãã©ã®å ´åæé»çã«è¡ããã¾ãã
JavaScript ã§ã®å²ãå½ã¦ å¤ã®åæåå²ãå½ã¦ã§ããã°ã©ãã¼ãæ©ã¾ããªãããã«ãJavaScript ã§ã¯å¤ã宣è¨ããã¨ãã¨åæã«ã¡ã¢ãªã¼ã®å²ãå½ã¦ãè¡ããã¾ãã
const n = 123; // æ°å¤ãæ ¼ç´ããã¡ã¢ãªã¼ãå²ãå½ã¦ããã¾ã
const s = "string"; // æååãæ ¼ç´ããã¡ã¢ãªã¼ãå²ãå½ã¦ããã¾ã
const o = {
a: 1,
b: null,
}; // ãªãã¸ã§ã¯ãã¨ããã«å«ã¾ããå¤ãæ ¼ç´ããããã®ã¡ã¢ãªã¼ãå²ãå½ã¦ããã¾ã
// ï¼ãªãã¸ã§ã¯ãã®ä¾ã¨åãããã«ï¼é
åã¨ããã«å«ã¾ããå¤ãæ ¼ç´ããããã®
// ã¡ã¢ãªã¼ãå²ãå½ã¦ããã¾ã
const a = [1, null, "str2"];
function f(a) {
return a + 2;
} // 颿°ãæ ¼ç´ããã¡ã¢ãªã¼ãå²ãå½ã¦ããã¾ã (颿°ã¯å¼ã³åºãå¯è½ãªãªãã¸ã§ã¯ãã§ã)
// 颿°å¼ã§ãã¡ã¢ãªã¼ã®å²ãå½ã¦ãè¡ããã¾ã
someElement.addEventListener(
"click",
() => {
someElement.style.backgroundColor = "blue";
},
false,
);
颿°å¼ã³åºããä»ãã¦å²ãå½ã¦
ä¸é¨ã®é¢æ°å¼ã³åºãã§ã¯ããªãã¸ã§ã¯ãã®å²ãå½ã¦ãçºçãã¾ãã
const d = new Date(); // Date ãªãã¸ã§ã¯ãã®å²ãå½ã¦
const e = document.createElement("div"); // DOMè¦ç´ ã®å²ãå½ã¦
ããã¤ãã®ã¡ã½ããã¯ãæ°ããå¤ã¾ãã¯ãªãã¸ã§ã¯ããå²ãå½ã¦ã¾ã:
const s = "string";
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 ã®å
容ãç¹ãåããã 4 è¦ç´ ã®é
åã使ããã¾ãã
å¤ã®ä½¿ç¨
å¤ã使ç¨ãããã¨ã¯ãåºæ¬çã«å²ãå½ã¦ãããã¡ã¢ãªã¼ã«èªã¿æ¸ããããã¨ãæå³ãã¾ããããã¯å¤æ°ããªãã¸ã§ã¯ãã®å¤ãèªã¿æ¸ããããã¨ã弿°ã颿°ã«æ¸¡ããã¨ã«ãã£ã¦è¡ããã¾ãã
ã¡ã¢ãªã¼ãä¸è¦ã«ãªã£ãã¨ãã®è§£æ¾ã¡ã¢ãªã¼ç®¡çã®åé¡ã®ã»ã¨ãã©ã¯ããã®æ®µéã«æ¥ã¾ããããã§æãé£ãã使¥ã¯ããå²ãå½ã¦ãããã¡ã¢ãªã¼ããå¿ è¦ã¨ãããªããªãã¨ããè¦åºãããã¨ã§ãã
ããã°ã©ã å ã®ã©ãã§ããã®ãããªã¡ã¢ãªã¼ã®æçãä¸è¦ã«ãªã£ã¦è§£æ¾ããå¿ è¦ãããããæ±ºå®ããã«ã¯ãéçºè ã«ãã夿ãå¿ è¦ãªãã¨ãå¤ãã§ãã
ä¸é¨ã®é«æ°´æºè¨èªãä¾ãã° JavaScript ã¯ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ (GC) ã¨ãã¦ç¥ãããèªåã¡ã¢ãªã¼ç®¡çã®æ¹å¼ãå©ç¨ãã¦ãã¾ããã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ã®ç®çã¯ãã¡ã¢ãªã¼ã®å²ãå½ã¦ãç£è¦ããå²ãå½ã¦ãããã¡ã¢ãªã¼ã®ãããã¯ãã§ããªããªã£ãã¨ãã«å¤æãããããååãããã¨ã§ããç¹å®ã®ã¡ã¢ãªã¼ãã¾ã å¿ è¦ãã©ããã夿ããä¸è¬çãªåé¡ã¯æ±ºå®ä¸è½ã§ããããããã®èªåå¦çã¯è¿ä¼¼çãªãã®ã§ãã
ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ä¸è¿°ã®éããããã¡ã¢ãªã¼ããå¿ è¦ãªããªã£ãããã©ãããèªåçã«ç¥ãã¨ããæ®éçåé¡ã¯ã決å®ä¸è½ã§ãããã®ãããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®ãã®æ®éçåé¡ã«å¯¾ãã解決çã«ã¯å¶éãããã¾ãããã®ç¯ã§ã¯ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®ä¸»ãªã¢ã«ã´ãªãºã ã¨ãã®éçãçè§£ããããã«å¿ è¦ãªæ¦å¿µã説æãã¾ãã
åç §ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¢ã«ã´ãªãºã ãä¾åãã¦ããä¸»ãªæ¦å¿µã¯ãåç § (reference) ã®æ¦å¿µã§ããã¡ã¢ãªã¼ç®¡çã®æèã§ã¯ããããªãã¸ã§ã¯ããå¥ã®ãªãã¸ã§ã¯ãã«ï¼æç¤ºçã«ã§ãããæé»çã«ã§ããï¼ã¢ã¯ã»ã¹ã§ããã¨ããåè ãå¾è ãåç §ãã¦ããã¨è¨ãã¾ããä¾ãã°ãJavaScript ãªãã¸ã§ã¯ãã¯èªèº«ã® ãããã¿ã¤ãï¼æé»çãªåç §ï¼ã¨ããããã£å¤ï¼æç¤ºçãªåç §ï¼ã¸ã®åç §ãæã¡ã¾ãã
ããã§ã¯ãããªãã¸ã§ã¯ããã®æ¦å¿µã¯é常㮠JavaScript ãªãã¸ã§ã¯ããããåºãæ¦å¿µã¨ãã¦ç¨ãããã¦ãããã¾ãã颿°ã®ã¹ã³ã¼ãï¼ãããã¯ãã°ãã¼ãã«ã¬ãã·ã«ã«ã¹ã³ã¼ãï¼ãå«ã¿ã¾ãã
åç §ã«ã¦ã³ãã®ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¡ã¢: ç¾ä»£ã® JavaScript ã¨ã³ã¸ã³ã§ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã«åç §ã«ã¦ã³ãã使ç¨ãã¦ãããã®ã¯ããããã¾ããã
ããã¯ãæãç´ æ´ãªã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¢ã«ã´ãªãºã ã§ãããã®ã¢ã«ã´ãªãºã ã¯ãããããªãã¸ã§ã¯ããå¿ è¦ãªããªã£ãããã¨ããããããªãã¸ã§ã¯ãããã®ä»ã®ãªãã¸ã§ã¯ãããåç §ããã¦ããªãããã¨ã¨å®ç¾©ãã¾ãããããªãã¸ã§ã¯ãã¯ãããã«å¯¾ããåç §ãã¼ãã®æã«ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³å¯è½ã§ããã¨è¦ãªããã¾ãã
ä¾let x = {
a: {
b: 2,
},
};
// 2 åã®ãªãã¸ã§ã¯ãã使ããã¾ããã䏿¹ã¯ãã䏿¹ã®ããããã£ã¨ãã¦åç
§ããã¦ãã¾ãã
// ãã䏿¹ã¯å¤æ° 'x' ã«ä»£å
¥ããã¦ããããããã¡ããåããåç
§ããã¦ãã¾ãã
// æããã«ãã©ã¡ãã®ãªãã¸ã§ã¯ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã«ãªãã¾ããã
let y = x;
// 夿° 'y' ã¯ããã®ãªãã¸ã§ã¯ããåç
§ãã 2 ã¤ç®ã®ãã®ã§ãã
x = 1;
// ããã§ãå
ã
'x' ã«ãã£ããªãã¸ã§ã¯ãã¯ã夿° 'y' ã«ãã£ã¦åºæã®åç
§ã
// å
·ç¾åããããã¨ã«ãªãã¾ãã
let z = y.a;
// ãªãã¸ã§ã¯ãã®ãããã㣠'a' ã¸ã®åç
§ã§ãã
// ããã§ããã®ãªãã¸ã§ã¯ãã¯2ã¤ã®åç
§å
ãæã¤ãã¨ã«ãªãã¾ããã
// 1 ã¤ã¯ããããã£ã¨ãã¦ããã 1 ã¤ã¯å¤æ° 'z' ã¨ãã¦ã§ãã
y = "mozilla";
// ãã¨ã㨠'x' ã«ãã£ããªãã¸ã§ã¯ãã¯ãããã§åç
§ãããªãã¸ã§ã¯ãã
// ã¼ãã«ãªãã¾ãããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããã¨ãã§ãã¾ãã
// ãããããã®ãããã㣠'a' ã¯ã¾ã 夿° 'z' ã«ãã£ã¦åç
§ããã¦ããããã
// è§£æ¾ãããã¨ã¯ã§ãã¾ããã
z = null;
// ãã¨ã㨠x ã«ãã£ããªãã¸ã§ã¯ãã®ãããã㣠'a' ã¯ãããã¸ã®åç
§ã
// ã¼ãã§ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããã¨ãã§ãã¾ãã
循ç°åç §ãããã¨ãå¶éãããã¾ãã以ä¸ã®ä¾ã§ã¯ãäºãã«åç §ããããããã£ãæã¤ 2 ã¤ã®ãªãã¸ã§ã¯ãã使ããã循ç°ãä½ãåºãã¦ãã¾ãããããã®ãªãã¸ã§ã¯ãã¯ã颿°ã®å¼ã³åºããå®å ¨ã«çµäºããã¨ãã¹ã³ã¼ãå¤ã«åºã¾ãããã®ç¹ã§ããªãã¸ã§ã¯ãã¯ä¸è¦ã¨ãªããå²ãå½ã¦ãããã¡ã¢ãªã¼ãååããå¿ è¦ãããã¾ããããããåç §ã«ã¦ã³ãã¢ã«ã´ãªãºã ã¯ã2 ã¤ã®ãªãã¸ã§ã¯ããããããå°ãªãã¨ã 1 ã¤ã®åç §ç¹ãæã£ã¦ãããããããããåçå¯è½ã¨ã¯è¦ãªãããçµæçã«ã©ã¡ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã«ãã¼ã¯ãããªããã¨ã«ãªãã¾ããåç §ãããªãã¸ã§ã¯ãã¯ãã¡ã¢ãªã¼ãªã¼ã¯ã®ä¸è¬çãªçºçãããåå ã§ãã
function f() {
const x = {};
const y = {};
x.a = y; // x references y
y.a = x; // y references x
return "azerty";
}
f();
ãã¼ã¯ã¢ã³ãã¹ã¤ã¼ãã¢ã«ã´ãªãºã
ãã®ã¢ã«ã´ãªãºã ã¯ãããããªãã¸ã§ã¯ããå¿ è¦ãªããªã£ãããã¨ããããããªãã¸ã§ã¯ããå°éä¸è½ã§ããããã¨ã¨å®ç¾©ãã¾ãã
ãã®ã¢ã«ã´ãªãºã ã¯ãroot ã¨å¼ã°ãããªãã¸ã§ã¯ãã®éåã«ã¤ãã¦ã®ç¥èãåæã¨ãã¦ãã¾ãï¼JavaScript ã§ã¯ãroot ã¯ã°ãã¼ãã«ãªãã¸ã§ã¯ãã§ãï¼ã宿çã«ãã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ã¯ããããã® root ããéå§ãããããã® root ããåç §ããããã¹ã¦ã®ãªãã¸ã§ã¯ããããããããããã®ä¸ããåç §ããããã¹ã¦ã®ãªãã¸ã§ã¯ããªã©ãè¦ã¤ãã¾ããroot ããéå§ããã¨ãã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ã¯ããã¹ã¦ã®å°éå¯è½ãªãã¸ã§ã¯ããè¦ã¤ãããã¹ã¦ã®å°éä¸è½ãªãªãã¸ã§ã¯ããã¬ãã¼ã¸ã³ã¬ã¯ããã¾ãã
ããããªãã¸ã§ã¯ããåç §ãæããªããã¨ãããã¨ã¯ããã®ãªãã¸ã§ã¯ãã¯å°éä¸è½ã§ããã¨ãããã¨ãªã®ã§ããã®ã¢ã«ã´ãªãºã ã¯åè¿°ã®ãã®ãããåªãã¦ãã¾ãã循ç°ã§è¦ãããã«ãéã¯æ£ããããã¾ããã
ç¾å¨ããã¹ã¦ã®ç¾ä»£çãªãã©ã¦ã¶ã¼ã§ã¯ããã¼ã¯ã¢ã³ãã¹ã¤ã¼ãå¼ã®ã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ãæã£ã¦ãã¾ããé廿°å¹´éã§ JavaScript ã®ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ï¼ä¸ä»£å¥/ã¤ã³ã¯ãªã¡ã³ã¿ã«/並è¡/並åã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ï¼ã®åéã§è¡ããããã¹ã¦ã®æ¹åã¯ããã®ã¢ã«ã´ãªãºã ã®å®è£ ã®æ¹åã§ãã£ã¦ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¢ã«ã´ãªãºã èªä½ã«å¯¾ããæ¹åã§ããããªãã¸ã§ã¯ããå¿ è¦ã¨ãããªããªã£ããã¨æ±ãåºæºãå¤ãããã®ã§ãããã¾ããã
ãã®ææ³ã®ç´æ¥çãªå¥½ã¾ãããã¨ã¯ã循ç°ãåé¡ã«ãªããªããªããã¨ã§ããä¸ã®æåã®ä¾ã§ã¯ã颿°å¼ã³åºããè¿ããå¾ã2ã¤ã®ãªãã¸ã§ã¯ãã¯ãã°ãã¼ãã«ãªãã¸ã§ã¯ãããå°éå¯è½ãªã©ã®ãªã½ã¼ã¹ãããåç §ãããªããªãã¾ããããã®çµæããããã¯ã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ã«ãã£ã¦å°éã§ããªããã¨ãåãããå²ãå½ã¦ãããã¡ã¢ãªã¼ãåå©ç¨ããããã¨ã«ãªãã¾ãã
ããããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãæåã§å¶å¾¡ãããã¨ãã§ããªãã®ã¯å¤ããã¾ããããã¤ãã©ããªã¡ã¢ãªã¼ãè§£æ¾ããããæåã§æ±ºãããã¨ãã§ããã°ä¾¿å©ãªæãããã¾ãããªãã¸ã§ã¯ãã®ã¡ã¢ãªã¼ãè§£æ¾ããããã«ã¯ãæç¤ºçã«å°éã§ããªãããã«ããå¿ è¦ãããã¾ããã¾ããJavaScript ã§ã¯ããã°ã©ã ã«ãã£ã¦ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãçºçããããã¨ã¯ã§ãã¾ããããã¨ã³ã¸ã³ããªããã¤ã³ãã©ã°ã§ API ãå ¬éãããã¨ã¯ãã£ã¦ããã³ã¢è¨èªã®ä¸ã§çºçãããã¨ã¯ãªãã§ãããã
ã¨ã³ã¸ã³ã®ã¡ã¢ãªã¼ã¢ãã«ãæ§æããJavaScript ã¨ã³ã¸ã³ã¯é常ãã¡ã¢ãªã¼ã¢ãã«ãå ¬éãããã©ã°ãæä¾ãã¾ããä¾ãã°ãNode.js ã¯ãã¡ã¢ãªã¼ã®åé¡ãæ§æãããããã°ããããã«ãåºç¤ã¨ãªãV8ã®ã¡ã«ããºã ãå ¬éãã追å ãªãã·ã§ã³ããã¼ã«ãæä¾ãã¦ãã¾ãããã®è¨å®ã¯ããã©ã¦ã¶ã¼ã§ã¯å©ç¨ã§ããªãããããã¾ããããã¦ã§ããã¼ã¸ã§ã¯ï¼HTTP ãããã¼ãªã©ãéãã¦ï¼ããã«å©ç¨ã§ããªãããããã¾ããã
å©ç¨ã§ãããã¼ãã¡ã¢ãªã¼ã®æå¤§éã¯ããã©ã°ã§å¢ãããã¨ãã§ãã¾ãã
node --max-old-space-size=6000 index.js
ã¾ãããã©ã°ã Chrome ãããã¬ã¼ãç¨ãã¦ãã¡ã¢ãªã¼ã®åé¡ããããã°ããããã«ã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ãå ¬éãããã¨ãã§ãã¾ãã
node --expose-gc --inspect index.js
ã¡ã¢ãªã¼ç®¡çãæ¯æ´ãããã¼ã¿æ§é
JavaScript ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ API ãç´æ¥å ¬éãã¦ãã¾ãããããã®è¨èªã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã鿥çã«ç£è¦ãããã¼ã¿æ§é ãããã¤ãæä¾ãã¦ãããã¡ã¢ãªã¼ä½¿ç¨éã管çããããã«ä½¿ç¨ãããã¨ãã§ãã¾ãã
WeakMap 㨠WeakSetWeakMap
㨠WeakSet
ã«ã¯ããã¼ã¿æ§é ãããä¼¼ãå¼±ããªãæ¹ã® APIãMap
㨠Set
ãããã¾ããWeakMap
ã¯ãã¼ã¨å¤ã®ãã¢ã®éåããWeakSet
ã¯åºæã®å¤ã®éåãä¿æãããã¨ãã§ããã©ã¡ãã追å ãåé¤ãåãåããã®å®è¡ãå¯è½ã§ããã
WeakMap
㨠WeakSet
ã¯ãweakly held å¤ã®æ¦å¿µããåã£ãååã§ããx
ã y
ã«ãã£ã¦å¼±ãä¿æããã¦ããå ´åãx
ã®å¤ã«ã¯ y
ãä»ãã¦ã¢ã¯ã»ã¹ã§ãã¾ããããã¼ã¯ã¢ã³ãã¹ã¤ã¼ãã¢ã«ã´ãªãºã ã§ã¯ãä½ãå¼·ãä¿æãããã®ããªããã° x
ã«å°éã§ããã¨ã¯èããªãã¨ãããã¨ãæå³ãã¦ãã¾ããããã§è°è«ãããã®ãé¤ãã»ã¨ãã©ã®ãã¼ã¿æ§é ã¯ãåæ ¼ãããªãã¸ã§ã¯ãããã¤ã§ãåãåºããããã«å¼·ãä¿æãã¾ããWeakMap
㨠WeakSet
ã®ãã¼ã¯ãããã°ã©ã å
ã§ãã®ãã¼ãåç
§ãã¦ãããã®ããªãéããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããã¨ãã§ãã¾ãï¼WeakMap
ãªãã¸ã§ã¯ãã®å ´åãå¤ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªãã¾ãï¼ãããã¯ã2 ã¤ã®ç¹å¾´ã«ãã£ã¦ç¢ºå®ã«ä¿æããã¾ãã
WeakMap
㨠WeakSet
ã¯ãªãã¸ã§ã¯ãã¾ãã¯ã·ã³ãã«ã®ã¿ãæ ¼ç´ãããã¨ãã§ãã¾ããããã¯ãªãã¸ã§ã¯ãã®ã¿ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªãããã§ããããªããã£ãå¤ã¯å¸¸ã«å½é å¯è½ã§ããï¼ã¤ã¾ãã 1 === 1
ã ã {} !== {}
ï¼ããããã¯æ°¸é ã«éåå
ã«çã¾ããã¨ã«ãªãã¾ããç»é²ãããã·ã³ãã«ï¼Symbol.for("key")
ãªã©ï¼ãå½é å¯è½ã§ãããããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã«ã¯ãªãã¾ãããã Symbol("key")
ã§ä½æãããã·ã³ãã«ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªãã¾ãã Symbol.iterator
ã®ãããªã¦ã§ã«ãã¦ã³ã·ã³ãã«ã¯åºå®çãªéåã§ãããããã°ã©ã ã®å®è¡æéãéãã¦ä¸æã§ãããããArray.prototype
ã®ãããªçµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã¨åæ§ã«ããã¼ã¨ãã¦ä½¿ç¨ãããã¨ãã§ãã¾ããWeakMap
㨠WeakSet
ã¯å復å¯è½ãªãªãã¸ã§ã¯ãã§ã¯ããã¾ããããã®ãããArray.from(map.keys()).length
ã使ç¨ãã¦ãªãã¸ã§ã¯ãã®çåçãç£è¦ããããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªããããªä»»æã®ãã¼ãåå¾ãããã¨ãã§ãã¾ãããï¼ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¯ä½¿ç¨å¯è½ãªéãä¸å¯è¦ã§ããã¹ãã§ããï¼WeakMap
ã WeakSet
ã®å
¸åçãªèª¬æï¼ä¸è¨ã®ãããªãã®ï¼ã§ã¯ããã¼ãæåã«ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããå¤ãåæ§ã«ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®ããã«è§£æ¾ããããã¨ãæç¤ºããã¦ãã¾ããããããå¤ããã¼ã«åç
§ããå ´åãèãã¦ã¿ã¾ãããã
const wm = new WeakMap();
const key = {};
wm.set(key, { key });
// ããã§ `key` ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã§ããªããªãã¾ããã
// å¤ã¯ãã¼ã¸ã®åç
§ãä¿æããå¤ã¯ãããã«å¼·ãä¿æããã¦
// ããããã§ãã
ãã key
ãå®éã®åç
§ã¨ãã¦æ ¼ç´ãããã¨ã循ç°åç
§ãçºçããä»ã« key
ãåç
§ãããã®ããªãå ´åã§ãããã¼ã¨å¤ã®ä¸¡æ¹ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡å¤ã«ãã¦ãã¾ãã¾ãããã key
ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããã¨ãå
·ä½çãªããç¬éã« value.key
ãåå¨ããªãã¢ãã¬ã¹ãæããã¨ã«ãªããããã¯ä¸æ£ãªç¶æ
ã ããã§ãããããä¿®æ£ããããã«ãWeakMap
㨠WeakSet
ã®é
ç®ã¯å®éã®åç
§ã§ã¯ãªãããã¼ã¯ã¢ã³ãã¹ã¤ã¼ãæ©æ§ãå¼·åããã¨ãã§ã¡ãã³ã§ããBarros ãã¯ããã®ã¢ã«ã´ãªãºã ã®è¯ãæ¦è¦ãæä¾ãã¦ãã¾ãï¼4 ãã¼ã¸ç®ï¼ã䏿®µè½ãå¼ç¨ãã¾ãã
ã¨ãã§ã¡ãã³ã¯å¼±ããã¢ãæ¹è¯ãããã®ã§ãéµãå¤ãå¼±ãã¨ãå¼·ãã¨ãåé¡ã§ãã¾ãããéµã®æ¥ç¶æ§ã¯å¤ã®æ¥ç¶æ§ã決å®ãã¾ãããå¤ã®æ¥ç¶æ§ã¯éµã®æ¥ç¶æ§ã«ã¯å½±é¿ãã¾ããã [â¦] ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãã¨ãã§ã¡ãã³ã«å¯¾å¿ããå ´åã2 ã¤ã®ãã§ã¼ãºï¼ãã¼ã¯ã¨ã¹ã¤ã¼ãï¼ã§ã¯ãªãã3 ã¤ã®ãã§ã¼ãºã§çºçãã¾ããï¼
大ã¾ããªã¡ã³ã¿ã«ã¢ãã«ã¨ãã¦ãWeakMap
ã¯ä»¥ä¸ã®ãããªå®è£
ã ã¨èãã¦ãã ããã
è¦å: ããã¯ããªãã£ã«ã§ã¯ãªããã¨ã³ã¸ã³ã§å®è£ ããã¦ããæ¹æ³ï¼ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³æ©æ§ã«ããã¯ãã¦ããï¼ã«ãè¿ããã®ã§ãã
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) {
// æååã® 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 èªä½ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã«ãªã£ãã¨ãã¦ãããããä¿æãã¦ããWeakRef
ãªãã¸ã§ã¯ãã¯ããã§ã¯ãªããããæéãçµã¤ã¨Map
ã«ç¡é§ãªã¨ã³ããªãããããæºã¾ã£ã¦ãã¾ãå¯è½æ§ãããã¾ããFinalizationRegistry
ã使ç¨ãããã¨ã§ããã®ãããªç¨éã®ã¯ãªã¼ã³ã¢ãããè¡ããã¨ãã§ãã¾ãã
function cached(getter) {
// æååã® URL ããçµæã® WeakRef ã¸å²ãå½ã¦ãããããã
const cache = new Map();
// å¤ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããå¾ãæ¯åããã£ãã·ã¥å
ã®
// ãã¼ã弿°ã«ã³ã¼ã«ããã¯ãå¼ã³åºããããã£ãã·ã¥ã®é
ç®ã
// åé¤ãããã¨ãã§ãã
const registry = new FinalizationRegistry((key) => {
// 注: WeakRef ãæ¬å½ã«ç©ºã§ãããã¨ããã¹ããããã¨ãéè¦ã§ãã
// ãããªããã°ããã®ãã¼ã§æ°ãããªãã¸ã§ã¯ãã追å ããããã®çãã¦ããæ°ãã
// ãªãã¸ã§ã¯ããåé¤ãããå¾ã«ã³ã¼ã«ããã¯ãå¼ã³åºãããå¯è½æ§ãããã¾ãã
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