ÙÙ Ø§ÙØ·Ùر ک٠از ÙØµÙ زباÙÙâØ±ÙØ¨Û Ù ÛâØ¯Ø§ÙÛÙ Ø Ù ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت تا ز٠اÙÛ Ú©Ù ÛÚ© Ù ÙØ¯Ø§Ø± Â«ÙØ§Ø¨Ù دسترس» باشد ٠٠٠ک٠باشد Ø§Ø³ØªÙØ§Ø¯Ù Ø´ÙØ¯Ø آ٠را در ØØ§Ùظ٠ÙÚ¯Ù Ù ÛâØ¯Ø§Ø±Ø¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
let john = { name: "John" };
// Ø¨Ù Ø¢Ù Ø±Ø¬ÙØ¹ Ù
ÛâÚ©ÙØ¯ john ØÙ
ÛâØªÙØ§Ù Ø¨Ù Ø´ÛØ¡ Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ کرد
// بازÙÙÛØ³Û Ù
رجع
john = null;
// Ø´ÛØ¡ از ØØ§Ùظ٠پاک Ù
ÛâØ´ÙØ¯
٠ع٠ÙÙØ§ ÙÛÚÚ¯ÛâÙØ§Û ÛÚ© Ø´ÛØ¡ ÛØ§ اÙ٠اÙâÙØ§Û ÛÚ© آراÛÙ ÛØ§ Ø³Ø§Ø®ØªØ§Ø±ÙØ§Û دÛگر داد٠تا ز٠اÙÛ Ú©Ù Ø¯Ø± ØØ§ÙØ¸Ù Ø¨Ø§Ø´Ø¯Ø ÙØ§Ø¨Ù دسترس ÙØ±Ø¶ ٠در ØØ§Ùظ٠ØÙظ Ù ÛâØ´ÙÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ اگر ٠ا ÛÚ© Ø´ÛØ¡ را درÙÙ ÛÚ© آراÛ٠بگذارÛÙ Ø Ø³Ù¾Ø³ تا ز٠اÙÛ Ú©Ù Ø¢Ø±Ø§ÛÙ Ø²ÙØ¯Ù Ø¨Ø§Ø´Ø¯Ø Ø´ÛØ¡ ÙÙ Ø²ÙØ¯Ù Ø®ÙØ§Ùد Ø¨ÙØ¯Ø ØØªÛ اگر ÙÛÚ Ø±Ø¬ÙØ¹ دÛÚ¯Ø±Û Ø¨Ù Ø¢Ù ÙØ¨Ø§Ø´Ø¯.
٠اÙÙØ¯ اÛÙØ¬Ø§:
let john = { name: "John" };
let array = [ john ];
john = null; // بازÙÙÛØ³Û Ù
رجع
// Ø¨Ù Ø¢Ù Ø±Ø¬ÙØ¹ Ù
ÛâØ´Ø¯Ø Ø¯Ø±Ù٠آراÛÙ Ø°Ø®ÛØ±Ù شد٠است john Ø´ÛØ¡Ø§Û Ú©Ù ÙØ¨Ùا ØªÙØ³Ø·
// ب٠ÙÙ
Û٠دÙÛ٠زباÙÙâØ±ÙØ¨Û ÙÙ
ÛâØ´ÙØ¯
// آ٠را Ø¯Ø±ÛØ§Ùت Ú©ÙÛÙ
array[0] Ù
ÛâØªÙØ§ÙÛÙ
با
Ù
شاب٠ÙÙ
ÛÙ Ù
ÙØ±Ø¯Ø اگر Ù
ا از Ø´ÛØ¡Ø§Û ب٠عÙÙØ§Ù Ú©ÙÛØ¯ در ÛÚ© Map Ù
عÙ
ÙÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø Ø³Ù¾Ø³ تا زÙ
اÙÛ Ú©Ù Map ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø¢Ù Ø´ÛØ¡ ÙÙ
ÙØ¬Ùد Ø®ÙØ§Ùد داشت. اÛÙ Ø´ÛØ¡ ØØ§Ùظ٠را اشغا٠Ù
ÛâÚ©ÙØ¯ ٠زباÙÙâØ±ÙØ¨Û ÙÙ
ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
let john = { name: "John" };
let map = new Map();
map.set(john, "...");
john = null; // بازÙÙÛØ³Û Ù
رجع
// ØØ°Ø®Ûر٠شد٠است map درÙÙ john
// آ٠را Ø¯Ø±ÛØ§Ùت Ú©ÙÛÙ
map.keys() Ù
ÛâØªÙØ§ÙÛÙ
با Ø§Ø³ØªÙØ§Ø¯Ù از
WeakMap Ø¨Ù ØµÙØ±Øª Ø§Ø³Ø§Ø³Û Ø§Ø² اÛÙ Ø¬ÙØ¨Ù ØªÙØ§Ùت دارد. اÛ٠ساختار از زباÙÙâØ±ÙØ¨Û Ú©ÙÛØ¯ÙاÛÛ Ú©Ù Ø´ÛØ¡ ÙØ³ØªÙد جÙÙÚ¯ÛØ±Û ÙÙ
ÛâÚ©ÙØ¯.
Ø¨ÛØ§ÛÛØ¯ با ٠ثاÙâÙØ§ ببÛÙÛ٠ک٠ب٠Ú٠٠عÙÛ Ø§Ø³Øª.
ساختار WeakMap
اÙÙÛÙ ØªÙØ§Ùت بÛÙ Map Ù WeakMap اÛ٠است Ú©Ù Ú©ÙÛØ¯Ùا Ø¨Ø§ÛØ¯ Ø´ÛØ¡ Ø¨Ø§Ø´ÙØ¯ ÙÙ Ù
ÙØ¯Ø§Ø± اÙÙÛÙ:
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // Ø¨Ù Ø¯Ø±Ø³ØªÛ Ú©Ø§Ø± Ù
ÛâÚ©ÙØ¯ (Ú©ÙÛØ¯ از ÙÙØ¹ Ø´ÛØ¡)
// ÙÙ
ÛâØªÙØ§Ù از رشت٠ب٠عÙÙØ§Ù Ú©ÙÛØ¯ Ø§Ø³ØªÙØ§Ø¯Ù کرد
weakMap.set("test", "Whoops"); // Ø´ÛØ¡ ÙÛØ³Øª "test" Ø§Ø±ÙØ± Ù
ÛâØ¯ÙØ¯ ÚÙÙ
ØØ§Ùا اگر ٠ا Ø¨Ø®ÙØ§ÙÛ٠از Ø´ÛØ¡ ب٠عÙÙØ§Ù Ú©ÙÛØ¯ در Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ Ù ÙÛÚ Ø±Ø¬ÙØ¹ دÛÚ¯Ø±Û Ø¨Ù Ø´ÛØ¡ ÙØ¨Ø§Ø´Ø¯ â Ø§ÛÙ Ø´ÛØ¡ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± از ØØ§Ùظ٠پاک Ù ÛâØ´ÙØ¯ (ÙÙ ÚÙÛ٠از map).
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // بازÙÙÛØ³Û Ù
رجع
// !از ØØ§Ùظ٠پاک شد john
با Map Ù
عÙ
ÙÙÛ Ø¯Ø± Ù
Ø«Ø§Ù Ø¨Ø§ÙØ§ Ù
ÙØ§Ûس٠کÙÛØ¯. ØØ§Ùا اگر john ÙÙØ· ب٠عÙÙØ§Ù Ú©ÙÛØ¯ WeakMap ÙØ¬Ùد داشت٠باشد â Ø¨Ù ØµÙØ±Øª Ø®ÙØ¯Ú©Ø§Ø± از map (Ù ØØ§ÙظÙ) پاک Ù
ÛâØ´ÙØ¯.
ساختار WeakMap از ØÙÙÙâØ²Ø¯Ù Ù Ù
ØªØ¯ÙØ§Û keys()Ø values()Ø entries() Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙÙ
ÛâÚ©ÙØ¯Ø پس ÙÛÚ Ø±Ø§ÙÛ Ø¨Ø±Ø§Û Ú¯Ø±ÙØªÙ تÙ
اÙ
Ú©ÙÛØ¯Ùا ÛØ§ Ù
ÙØ¯Ø§Ø±Ùا ÙÛØ³Øª.
WeakMap ÙÙØ· Ù
ØªØ¯ÙØ§Û Ø²ÛØ± دارد:
ÚØ±Ø§ ÚÙÛÙ Ù
ØØ¯ÙØ¯ÛØªâÙØ§ÛÛ ÙØ¬Ùد Ø¯Ø§Ø±Ø¯Ø Ø¨Ù Ø®Ø§Ø·Ø± Ø¯ÙØ§ÛÙ ÙÙÛ. اگر ÛÚ© Ø´ÛØ¡ تÙ
اÙ
Ø±Ø¬ÙØ¹âÙØ§Û دÛگر Ø¨Ù Ø®ÙØ¯ را از دست Ø¨Ø¯ÙØ¯ (Ù
اÙÙØ¯ john در کد Ø¨Ø§ÙØ§)Ø Ø³Ù¾Ø³ Ø¨Ø§ÛØ¯ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± زباÙÙâØ±ÙØ¨Û Ø´ÙØ¯. اÙ
ا از ÙØØ§Ø¸ ÙÙÛ Ù
شخص ÙÛØ³Øª ک٠زباÙÙâØ±ÙØ¨Û Ú٠زÙ
اÙÛ Ø§ØªÙØ§Ù Ù
ÛâØ§ÙØªØ¯.
Ù
ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت دربار٠آ٠تصÙ
ÛÙ
Ù
ÛâÚ¯ÛØ±Ø¯. Ù
Ù
ک٠است Ù¾Ø§Ú©âØ³Ø§Ø²Û ØØ§Ùظ٠را Ø¨ÙØ§ÙاصÙÙ Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯ ÛØ§ صبر Ú©ÙØ¯ تا ØØ°ÙâÙØ§Û Ø¨ÛØ´ØªØ±Û رخ دÙÙØ¯. پس Ø¨Ù Ø·ÙØ± ÙÙÛØ تعداد Ú©ÙÙÙÛ Ø§ÙÙ
اÙâÙØ§Û WeakMap Ù
عÙÙÙ
ÙÛØ³Øª. Ù
ÙØªÙر Ù
Ù
ک٠است آ٠را پاک کرد٠باشد ÛØ§ اÛ٠کار را در ÚÙØ¯ ÙØ³Ù
ت Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯. ب٠اÛ٠دÙÛÙØ Ù
ØªØ¯ÙØ§ÛÛ Ú©Ù Ø¨Ù ØªÙ
اÙ
Ú©ÙÛØ¯Ùا/Ù
ÙØ¯Ø§Ø±Ùا Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ù
ÛâÚ©ÙÙØ¯Ø Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙÙ
ÛâØ´ÙÙØ¯.
ØØ§Ùا ٠ا کجا ب٠ÚÙÛ٠ساختار دادÙâØ§Û Ø§ØØªÛاج دارÛÙ Ø
کاربرد: داد٠اضاÙÛ
ØÙز٠اصÙÛ Ú©Ø§Ø±Ø¨Ø±Ø¯ WeakMap ÛÚ© ØØ§Ùظ٠داد٠اضاÙÛ Ø§Ø³Øª.
اگر در ØØ§Ù کار کرد٠با Ø´ÛØ¡Ø§Û ÙØ³ØªÛÙ
ک٠ب٠کد دÛÚ¯Ø±Û Â«ØªØ¹ÙÙ Ø¯Ø§Ø±Ø¯Â»Ø Ø´Ø§ÛØ¯ ÛÚ© کتابخاÙ٠شخص Ø«Ø§ÙØ«Ø Ù Ø¨Ø®ÙØ§ÙÛÙ
دادÙâÙØ§ÛÛ Ú©Ù Ø¨Ù Ø¢Ù ØªØ®ØµÛØµ داد٠شد٠را Ø°Ø®ÛØ±Ù Ú©ÙÛÙ
Ú©Ù ÙÙØ· تا زÙ
اÙÛ Ú©Ù Ø´ÛØ¡ Ø²ÙØ¯Ù است ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯Ø سپس WeakMap دÙÛÙØ§ ÚÛØ²Û است Ú©Ù ÙÛØ§Ø² دارÛÙ
.
Ù
ا با Ø§Ø³ØªÙØ§Ø¯Ù از Ø´ÛØ¡ ب٠عÙÙØ§Ù Ú©ÙÛØ¯Ø داد٠را در ÛÚ© WeakMap ÙØ±Ø§Ø± Ù
ÛâØ¯ÙÛÙ
٠زÙ
اÙÛ Ú©Ù Ø´ÛØ¡ زباÙÙâØ±ÙØ¨Û Ø´Ø¯Ø Ø¯Ø§Ø¯Ù ÙÙ
Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ÙØ§Ù¾Ø¯Ûد Ù
ÛâØ´ÙØ¯.
weakMap.set(john, "Ù
Ø³ØªÙØ¯Ø§Øª Ù
Ø®ÙÛ");
// ازبÛÙ Ø¨Ø±ÙØ¯Ø Ù
Ø³ØªÙØ¯Ø§Øª Ù
Ø®ÙÛ ÙÙ
Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ÙØ§Ø¨Ùد Ù
ÛâØ´ÙÙØ¯ john اگر
Ø¨ÛØ§ÛÛØ¯ ÛÚ© ٠ثا٠ببÛÙÛÙ .
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ٠ا Ú©Ø¯Û Ø¯Ø§Ø±Û٠ک٠تعداد Ø¨Ø§Ø²Ø¯ÛØ¯ را Ø¨Ø±Ø§Û Ú©Ø§Ø±Ø¨Ø±Ø§Ù Ø°Ø®ÛØ±Ù Ù ÛâÚ©ÙØ¯. Ø§Ø·ÙØ§Ø¹Ø§Øª درÙÙ ÛÚ© map Ø°Ø®ÛØ±Ù شد٠است: ÛÚ© Ø´ÛØ¡ user Ú©ÙÛØ¯ است ٠تعداد Ø¨Ø§Ø²Ø¯ÛØ¯ Ù ÙØ¯Ø§Ø± است. ز٠اÙÛ Ú©Ù Ú©Ø§Ø±Ø¨Ø± خارج Ø´ÙØ¯ (Ø´ÛØ¡ آ٠زباÙÙâØ±ÙØ¨Û Ø´ÙØ¯)Ø Ù Ø§ دÛگر ÙÙ ÛâØ®ÙØ§ÙÛ٠تعداد Ø¨Ø§Ø²Ø¯ÛØ¯ Ø¢ÙÙØ§ را داشت٠باشÛÙ .
ÛÚ© Ù
ثا٠از تابع Ø´Ù
Ø§Ø±ÙØ¯Ù با Ø§Ø³ØªÙØ§Ø¯Ù از Map:
// ð visitsCount.js
let visitsCountMap = new Map(); // map: user => تعداد Ø¨Ø§Ø²Ø¯ÛØ¯
// Ø§ÙØ²Ø§ÛØ´ تعداد Ø¨Ø§Ø²Ø¯ÛØ¯
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
٠اÛÙØ¬Ø§ ÙØ³Ù ت دÛÚ¯Ø±Û Ø§Ø² کد را دارÛÙ Ø Ø´Ø§ÛØ¯ ÛÚ© ÙØ§Û٠دÛگر از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙØ¯:
// ð main.js
let john = { name: "John" };
countUser(john); // را Ù
ÛâØ´Ù
ارد john تعداد Ø¨Ø§Ø²Ø¯ÛØ¯
// Ù
ا را ترک Ú©ÙØ¯ john بعدا Ú©Ù
john = null;
ØØ§ÙØ§Ø Ø´ÛØ¡ john Ø¨Ø§ÛØ¯ زباÙÙâØ±ÙØ¨Û Ø´ÙØ¯ اÙ
ا در ØØ§Ùظ٠Ù
ÛâÙ
Ø§ÙØ¯Ø ب٠دÙÛ٠اÛÙک٠در visitsCountMap Ú©ÙÛØ¯ است.
Ù
ا ÙÛØ§Ø² دارÛÙ
Ú©Ù visitsCountMap را زÙ
اÙÛ Ú©Ù Ú©Ø§Ø±Ø¨Ø±Ø§Ù Ø±Ø§ ØØ°Ù Ù
ÛâÚ©ÙÛÙ
پاک Ú©ÙÛÙ
Ø Ø¯Ø± ØºÛØ± اÛÙ ØµÙØ±Øª Ø¨Ù Ø·ÙØ± ÙØ§Ù
ØØ¯Ùد در ØØ§Ùظ٠گستردÙâØªØ± Ù
ÛâØ´ÙØ¯. ÚÙÛ٠پاک کردÙÛ Ø¯Ø± Ù
عÙ
ارÛâÙØ§Û Ù¾ÛÚÛØ¯Ù Ú©Ø§Ø±Û Ø®Ø³ØªÙâÚ©ÙÙØ¯Ù Ù
ÛâØ´ÙØ¯.
Ù
ÛâØªÙØ§ÙÛÙ
با Ø§Ø³ØªÙØ§Ø¯Ù از WeakMap از اÛÙ Ù
ÙØ¶Ùع Ø¯ÙØ±Û Ú©ÙÛÙ
:
// ð visitsCount.js
let visitsCountMap = new WeakMap(); // weakmap: user => تعداد Ø¨Ø§Ø²Ø¯ÛØ¯
// Ø§ÙØ²Ø§ÛØ´ تعداد Ø¨Ø§Ø²Ø¯ÛØ¯
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
ØØ§Ùا Ù
ا ØØªÙ
ا ÙØ¨Ø§Ûد visitsCountMap را تÙ
ÛØ² Ú©ÙÛÙ
. بعد از اÛÙÚ©Ù Ø´ÛØ¡ john ØºÛØ±Ùاب٠دسترس Ø´ÙØ¯Ø ÛØ¹ÙÛ Ø¨Ù Ø¬Ø² Ú©ÙÛØ¯ WeakMap ÙÛÚ Ø±Ø¬ÙØ¹Û ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø ÙÙ
را٠با Ø§Ø·ÙØ§Ø¹Ø§ØªÛ Ú©Ù Ú©ÙÛØ¯ Ø¢ÙÙØ§ اÛÙ Ø´ÛØ¡ Ø¨ÙØ¯Ø از ØØ§Ùظ٠پاک Ù
ÛâØ´ÙÙØ¯.
کاربرد: Ú©ÙØ´ کرد٠(caching)
ÛÚ©Û Ø¯Ûگر از ٠ثاÙâÙØ§Û ٠تداÙÙ Ú©ÙØ´ کرد٠است. ٠ا Ù ÛâØªÙØ§ÙÛÙ ÙØªØ§Ûج ÛÚ© تابع را Ø°Ø®ÛØ±Ù (Â«Ú©ÙØ´Â») Ú©ÙÛ٠تا ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û Ø¢ÛÙØ¯Ù Ú©Ù Ø´ÛØ¡ ÛکساÙÛ Ø±Ø§ Ù ÛâÚ¯ÛØ±ÙØ¯Ø Ø¯ÙØ¨Ø§Ø±Ù از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÙØ¯.
Ø¨Ø±Ø§Û Ø§ÛÙ Ú©Ø§Ø±Ø Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
از Map Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
(اÛÙ Ø³ÙØ§Ø±Û٠بÙÛÙÙ ÙÛØ³Øª):
// ð cache.js
let cache = new Map();
// ÙØªÛج٠را Ù
ØØ§Ø³Ø¨Ù Ù Ø°Ø®ÛØ±Ù Ú©Ù
function process(obj) {
if (!cache.has(obj)) {
let result = obj /* Ù
ØØ§Ø³Ø¨Ø§Øª ÙØªÛØ¬Ù Ø¨Ø±Ø§Û */;
cache.set(obj, result);
return result;
}
return cache.get(obj);
}
// :در ÙØ§Û٠دÛÚ¯Ø±Û Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
process() ØØ§Ùا Ù
ÛâØªÙØ§ÙÛÙ
از
// ð main.js
let obj = {/* ÙØ±Ø¶ Ù
ÛâÚ©ÙÛÙ
ÛÚ© Ø´ÛØ¡ دارÛÙ
*/};
let result1 = process(obj); // Ù
ØØ§Ø³Ø¨Ù شد
// ...Ø¨Ø¹Ø¯Ø§Ø Ø§Ø² ÛÚ© Ø¬Ø§Û Ø¯Ûگر کد...
let result2 = process(obj); // ÙØªÛØ¬Ù Ø°Ø®ÛØ±Ù شد٠از Ú©ÙØ´ Ú¯Ø±ÙØªÙ Ù
ÛâØ´ÙØ¯
// :Ø¨Ø¹Ø¯Ø§Ø Ø²Ù
اÙÛ Ú©Ù Ø´ÛØ¡ دÛگر ÙÛØ§Ø² ÙØ¨Ø§Ø´Ø¯...
obj = null;
alert(cache.size); // 1 (!Ø§Û ÙØ§Û! Ø´ÛØ¡ ÙÙÙØ² در Ú©Ø´ Ù
ÙØ¬Ùد است Ù ØØ§Ùظ٠را اشغا٠Ù
ÛâÚ©ÙØ¯)
Ø¨Ø±Ø§Û ÚÙØ¯ ÙØ±Ø§Ø®ÙاÙÛ process(obj) ÙÙ
را٠با Ø´ÛØ¡ ÛÚ©Ø³Ø§ÙØ تÙÙØ§ ÙØªÛج٠را اÙÙÛ٠بار Ù
ØØ§Ø³Ø¨Ù Ù
ÛâÚ©ÙØ¯ ٠سپس آ٠را از cache Ù
ÛâÚ¯ÛØ±Ø¯. ÙÛÚÚ¯Û Ù
ÙÙÛ Ø§Û٠است ک٠زÙ
اÙÛ Ú©Ù Ø´ÛØ¡ دÛگر Ø§ØØªÛاج ÙØ¨Ø§Ø´Ø¯Ø Ù
ا Ø¨Ø§ÛØ¯ cache را از آ٠تÙ
ÛØ² Ú©ÙÛÙ
.
اگر Ù
ا Map را با WeakMap جاÛگزÛÙ Ú©ÙÛÙ
Ø Ø³Ù¾Ø³ اÛÙ Ù
Ø´Ú©Ù Ø§ÛØ¬Ø§Ø¯ ÙÙ
ÛâØ´ÙØ¯. ÙØªÛØ¬Ù Ú©Ø´âØ´Ø¯Ù Ø¨Ø¹Ø¯ از اÛÙÚ©Ù Ø´ÛØ¡ زباÙÙâØ±ÙØ¨Û Ø´Ø¯Ø Ø§Ø² ØØ§ÙØ¸Ù Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ØØ°Ù Ù
ÛâØ´ÙØ¯.
// ð cache.js
let cache = new WeakMap();
// ÙØªÛج٠را Ù
ØØ§Ø³Ø¨Ù Ù Ø°Ø®ÛØ±Ù Ú©Ù
function process(obj) {
if (!cache.has(obj)) {
let result = obj /* Ù
ØØ§Ø³Ø¨Ø§Øª ÙØªÛØ¬Ù Ø¨Ø±Ø§Û */;
cache.set(obj, result);
return result;
}
return cache.get(obj);
}
// ð main.js
let obj = {/* Ø´ÛØ¡ */};
let result1 = process(obj);
let result2 = process(obj);
// :Ø¨Ø¹Ø¯Ø§Ø Ø²Ù
اÙÛ Ú©Ù Ø´ÛØ¡ دÛگر ÙÛØ§Ø² ÙØ¨Ø§Ø´Ø¯...
obj = null;
// است WeakMap را Ø¯Ø±ÛØ§Ùت Ú©Ø±Ø¯Ø ÚÙÙ ÛÚ© cache.size ÙÙ
ÛâØªÙØ§Ù
// اÙ
ا ÛØ§ 0 است ÛØ§ Ø¨Ù Ø²ÙØ¯Û 0 Ù
ÛâØ´ÙØ¯
// زباÙÙâØ±ÙØ¨Û Ø´ÙØ¯Ø Ø¯Ø§Ø¯Ù Ú©Ø´âØ´Ø¯Ù ÙÙ
پاک Ù
ÛâØ´ÙØ¯ obj زÙ
اÙÛ Ú©Ù
ساختار WeakSet
WeakSet ÙÙ
Ø±ÙØªØ§Ø± Ù
شابÙÛ Ø¯Ø§Ø±Ø¯:
- اÛ٠ساختار Ù
اÙÙØ¯
Setاست ا٠ا ÙÙØ· Ù ÛâØªÙØ§ÙÛÙ Ø´ÛØ¡Ùا را بÙWeakSetاضاÙÙ Ú©ÙÛÙ (ÙÙ Ù ÙØ¯Ø§Ø±ÙØ§Û Ø§ØµÙÛ). - ÛÚ© Ø´ÛØ¡ تا ز٠اÙÛ Ú©Ù Ø§Ø² جاÛÛ Ø¯Ûگر ÙØ§Ø¨Ù دسترس باشد در set ÙØ¬Ùد Ø®ÙØ§Ùد داشت.
- Ù
اÙÙØ¯
SetØ Ø§Û٠ساختار ازaddØhasÙdeleteÙ¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛâÚ©ÙØ¯ ا٠اsizeÙkeys()ÙØ¯Ø§Ø±Ø¯ Ù ÙÙ ÛâØªÙØ§Ù در Ø¢Ù ØÙÙ٠زد.
ب٠دÙÛ٠اÛÙÚ©Ù âweak(ضعÛÙ)â Ø§Ø³ØªØ ب٠عÙÙØ§Ù ØØ§Ùظ٠اضاÙÛ ÙÙ
ÙÙØ´Ø´ را اÛÙØ§ Ù
ÛâÚ©ÙØ¯. اÙ
ا ÙÙ Ø¨Ø±Ø§Û ÙØ± Ø¯Ø§Ø¯Ù Ø¯ÙØ®ÙاÙÛØ بÙÚ©Ù ØªØ±Ø¬ÛØØ§ Ø¨Ø±Ø§Û Ú¯Ø²Ø§Ø±ÙâÙØ§Û «بÙÙ/Ø®ÛØ±Â» Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯. اÛÙÚ©Ù ÛÚ© Ø´ÛØ¡ در WeakSet ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ù
Ù
ک٠است ب٠Ù
Ø¹ÙØ§Û ÚÛØ²Û دربار٠آ٠باشد.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
کاربرا٠را ب٠WeakSet اضاÙÙ Ú©ÙÛÙ
تا Ù¾ÛÚ¯ÛØ±Û Ú©ÙÛÙ
Ú©Ù ÚÙ Ú©Ø³Û Ø³Ø§ÛØª Ù
ا را Ø¯ÛØ¯Ù است:
let visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
visitedSet.add(john); // Ø³Ø§ÛØª Ù
ا را Ø¯ÛØ¯ John
visitedSet.add(pete); // Pete سپس
visitedSet.add(john); // John Ù Ø¯ÙØ¨Ø§Ø±Ù
// Ø§ÙØ§Ù 2 کاربر دارد visitedSet
// Ø³Ø§ÛØª را Ø¯ÛØ¯Ù Ø§Ø³ØªØ John ÚÚ© Ù
ÛâÚ©ÙÛÙ
Ú©Ù Ø¢ÛØ§
alert(visitedSet.has(john)); // true
// Ø³Ø§ÛØª را Ø¯ÛØ¯Ù Ø§Ø³ØªØ Mary ÚÚ© Ù
ÛâÚ©ÙÛÙ
Ú©Ù Ø¢ÛØ§
alert(visitedSet.has(mary)); // false
john = null;
// Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± از Ø¢Ù Ø´ÛØ¡ تÙ
ÛØ² Ù
ÛâØ´ÙØ¯ visitedSet
Ø¨Ø²Ø±Ú¯âØªØ±ÛÙ Ù
ØØ¯ÙØ¯ÛØª WeakMap Ù WeakSet اÛ٠است Ú©Ù ÙÙ
ÛâØªÙØ§Ù در Ø¢Ù ØÙÙ٠زد ٠تÙ
اÙ
Ù
ØØªÙØ§Û ØØ§Ù ØØ§Ø¶Ø± را Ú¯Ø±ÙØª. اÛÙ Ù
ÙØ¶Ùع Ù
Ù
ک٠است Ø§Ø°ÛØª Ú©ÙÙØ¯Ù باشد اÙ
ا باعث ÙÙ
ÛâØ´ÙØ¯ Ú©Ù WeakMap/WeakSet کار اصÙÛ Ø®ÙØ¯Ø´Ø§Ù را Ø§ÙØ¬Ø§Ù
ÙØ¯ÙÙØ¯ â Ø§ÛÙÚ©Ù ÛÚ© ØØ§Ùظ٠«اضاÙÛÙ» Ø¯Ø§Ø¯ÙØ Ø¨Ø±Ø§Û Ø´ÛØ¡ÙاÛÛ Ø¨Ø§Ø´ÙØ¯ ک٠در جاÛÛ Ø¯Ûگر Ø°Ø®ÛØ±Ù/Ù
Ø¯ÛØ±Ûت Ù
ÛâØ´ÙÙØ¯.
Summary
WeakMap ÛÚ© Ù
جÙ
ÙØ¹Ù Map-like است Ú©Ù ÙÙØ· Ø´ÛØ¡Ùا را ب٠عÙÙØ§Ù Ú©ÙÛØ¯ ÙØ¨ÙÙ Ù
ÛâÚ©ÙØ¯ Ù ÙÙ
Ø§Ù Ø´ÛØ¡ ٠دادÙâÙØ§Û ØªØ®ØµÛØµ داد٠شد٠ب٠آ٠را زÙ
اÙÛ Ú©Ù Ø´ÛØ¡ از طر٠دÛگر ØºÛØ± ÙØ§Ø¨Ù دسترس Ø´ÙØ¯Ø ØØ°Ù Ù
ÛâÚ©ÙØ¯.
WeakSet ÛÚ© Ù
جÙ
ÙØ¹Ù Set-like است Ú©Ù ÙÙØ· Ø´ÛØ¡Ùا را Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙØ¯ ٠زÙ
اÙÛ Ú©Ù Ø¢ÙÙØ§ از طر٠دÛگر ØºÛØ± ÙØ§Ø¨Ù دسترس Ø´ÙÙØ¯Ø ØØ°ÙâØ´Ø§Ù Ù
ÛâÚ©ÙØ¯.
ÙØ§ÛدÙâÙØ§Û اصÙÛâØ´Ø§Ù Ø§Û٠است Ú©Ù ÛÚ© Ø±Ø¬ÙØ¹ ضعÛÙ Ø¨Ù Ø´ÛØ¡Ùا Ø¯Ø§Ø±ÙØ¯Ø پس Ø´ÛØ¡Ùا Ø¨Ù Ø±Ø§ØØªÛ Ù ÛâØªÙØ§ÙÙØ¯ با زباÙÙâØ±ÙØ¨Û ازبÛ٠برÙÙØ¯.
اÙ
ا ب٠اÛÙ ÙÛÙ
ت ک٠از clearØ sizeØ keysØ values Ùâ¦ Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙÙ
ÛâÚ©ÙÙØ¯.
WeakMap Ù WeakSet ب٠عÙÙØ§Ù ساختار دادÙâÙØ§Û «ثاÙÙÛÙ» در Ú©ÙØ§Ø± ØØ§ÙØ¸Ù Ø´ÛØ¡ «اصÙÛ» Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙÙØ¯. زÙ
اÙÛ Ú©Ù Ø´ÛØ¡ از ØØ§Ùظ٠اصÙÛ ØØ°Ù Ø´ÙØ¯ Ù ÙÙØ· ب٠عÙÙØ§Ù Ú©ÙÛØ¯ WeakMap ÛØ§ عضÙÛ Ø¯Ø± WeakSet Ø¨Ø§Ø´Ø¯Ø Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ØØ°Ù Ù
ÛâØ´ÙØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)