
ببساطة، إذا كان المتغير أو الكائن "غير قابل للوصول"، فليست هناك حاجة لمواصلة تخزين المتغير أو الكائن في الذاكرة ويجب إعادة تدويره.
على سبيل المثال:
Let xiaoming = {name:'xiaoming'}// أنشئ كائنًا واستخدم المتغير xiaoming للإشارة إلى xiaoming = null // اجعل المتغير xiaoming فارغًا، مما يجعل الكائن {name:'xiaoming'} غير قابل للوصول//{ name:'xiaoming'} يتم إعادة تدوير الكائن إذا تمت الإشارة إلى كائن بواسطة مصفوفة وكائنات أخرى، طالما أن المصفوفة والكائن الذي يشير إليه موجودان في المصفوفة، فسيتم اعتبار الكائن قابلاً للوصول.
الكائنات الموجودة في المصفوفة:
Let xiaoming = {name:'xiaoming'}
دع آر = [شياومينغ]
xiaoming = null // اجعل المتغير xiaoming فارغًا // لن يتم تحرير الكائن {name:'xiaoming'} لأنه موجود في المصفوفة. وبالمثل، إذا استخدمنا كائنًا كمفتاح Map ، إذا كانت Map موجودة ، فلن يقوم المحرك بإعادة تدوير الكائن.
الكائن الرئيسي في Map :
Let xiaoming = {name:'xiaoming'}
دع الخريطة = خريطة جديدة ()
Map.set(شياومينغ، "صبي")
xiaoming = null // اجعل المتغير xiaoming فارغًا // لن يتم إصدار الكائن {name:'xiaoming'} لأنه مفتاح الخريطة، يختلف WeapMap بشكل أساسي عن Map في معالجة تحرير الكائنات الرئيسية إنه ببساطة لن يمنع WeapMap جمع البيانات المهملة بسبب وجود كائنات كمفاتيح.
يمكن تقسيم الفرق بين WeakMap و Map إلى ثلاثة جوانب:
WeakMap استخدام الكائنات كمفاتيح فقط،دع WeakMap = new WeakMap()
دع الكائن = {الاسم:'obj'}
WeakMap.set(obj,'obj كمفتاح')
WeakMap.set('str','str as the key')// نتائج تنفيذ رمز الخطأ هي كما يلي:

يمكن ملاحظة أنه عندما نستخدم السلاسل النصية key ، لا يمكن تنفيذ البرنامج بشكل طبيعي.
بمعنى آخر، إذا لم يكن للكائن أي مراجع أخرى باستثناء مرجع WeakMap ، فسيتم إعادة تدوير الكائن بواسطة النظام.
على سبيل المثال:
دع WeakMap = new WeakMap()
دع الكائن = {الاسم:'obj'}
WeakMap.set(obj,'obj كمفتاح')
obj = null // اجعل المتغير obj فارغًا // في هذا الوقت، سيتم إعادة تدوير الكائن {name:'obj'} WeakMap يدعم طرقًا محدودةWeakMap لا يدعم التكرارWeakMap لا يدعم keys()WeakMap لا يدعم values()WeakMap entires()، لذلك ليس لدينا طريقة للحصول على جميع أزواج القيمة الرئيسية.
يمكن لـ WeakMap استخدام الطرق التالية فقط:
weakMap.get(key) احصل على زوج القيمة الرئيسيةضعفweakMap.set(key,val) قم بتعيين زوج القيمة الرئيسيةضعفweakMap.delete(key) احذف زوج القيمة الرئيسيةضعفweakMap.has(key) تحديد ما إذا كانموجودًا يجب تقييد طريقة الوصول إلى البيانات الخاصة بـ WeakMap لأنه لا يمكن تحديد توقيت إطلاق محرك JavaScript للكائن.
عندما يفقد كائن ما كافة المراجع، قد يقوم محرك JavaScript بتحرير المساحة التي يشغلها الكائن على الفور، أو قد ينتظر لفترة من الوقت.
لذلك، في لحظة معينة، لا يمكن تحديد عدد عناصر WeakMap . (تخيل أننا إذا اجتزنا عناصر WeakMap بعد أن يفقد الكائن جميع المراجع، فقد نحصل على نتائج مختلفة.)
عادةً ما يكون سيناريو تطبيق WeakMap هو تخزين البيانات التي "تنتمي" إلى كائن عندما لا يكون الكائن كذلك عند وجودها، يجب أيضًا تحرير البيانات "الخاصة" بهذا الكائن.
هناك قصة تاريخية مناسبة جدًا لاستخدام WeakMap`: "يموت الأرنب الماكر، وينضج الخدم، وتختفي الطيور، ويتم إخفاء القوس الجيد."
إذا وصفنا هذه القصة في كود JavaScript ، فيجب علينا استخدام WeakMap :
Let WeakMap = new WeakMap()
Let Rabbit = {name:'rabbit'} // الأرنب الماكر Let runDog = {name:'runDog'} // الكلب الجاري Let flyBird = {name:'flyBird'} // الطائر الطائر Let goodBow = {name :'goodBow'} // Liang Gong WeakMap.set(rabbit,runDog)
WeakMap.set(flyBird,goodBow)
Rabbit = null // يموت الأرنب الماكر flyBird = null // لقد اختفت الطيور // قريبًا، سيتم إطلاق سراح الخدم والقوس الجيد، ربما ليس على الفور // تخبرنا هذه القصة أنه لا توجد نهاية جيدة لكونك إنسانًا لاكي، ربما لا يتم قتله على الفور بواسطة //، ولكن سيتم قتله عاجلاً أم آجلاً. بالمقارنة مع Set، Set WeakSet التالية:
WeakSet إضافة عناصر الكائن فقطWeakSet add()WeakSet من إعادة تدوير العناصر.add() ، has() ، delete()WeakSet لا يدعم سمة size وطريقة keys()يمكننا استخدام WeakMap للتحقق من بعض معلومات الوجود، أو التحقق من الحالة مثل "نعم/لا"، على سبيل المثال، يمكننا استخدام WeakMap لتحديد ما إذا كان المستخدم متصلاً بالإنترنت:
Let onlineUser = new WeakMap()
دع zhangSan = {name:'Zhang San'}
دع liSi = {الاسم:'李思'}
دع wangEr = {الاسم:'王二'}
دع مازي = {الاسم:'مازي'}
تسجيل الدخول للوظيفة (المستخدم) {
... ...
onlineUser.add(مستخدم)
}
// تحديد ما إذا كان المستخدم متصلاً بالإنترنت function isOnline(user){
العودة عبر الإنترنتUser.has (المستخدم)
} تتمثل حدود WeakMap و WeakSet في عدم قدرتهما على التكرار والحصول على جميع العناصر مرة واحدة، مما لا يؤثر على دورهما المهم في الأماكن الحرجة للغاية.
WeakMap استخدام الكائنات كمفاتيح فقط. عند فقدان جميع المراجع الخارجية للمفتاح (لا توجد متغيرات أخرى باستثناء WeakMap تشير إلى الكائن الرئيسي)، لن يمنع WeakMap المحرك من إعادة تدوير قيمة المفتاح. بمجرد إعادة تدويرها، لن تعد العناصر المقابلة لـ WeakMap موجودة.WeakSet تخزين الكائنات فقط بمجرد أن يفقد عنصر الكائن جميع المراجع الخارجية (باستثناء WeakSet ، لا تشير أي متغيرات أخرى إلى كائن العنصر)، فلن يمنع WeakSet المحرك من إعادة تدوير العنصر. بمجرد إعادة تدويرها، تختفي العناصر المقابلة لها في WeakSet .clear() و size و keys() و values()WeakMap هياكل البيانات WeakSet بالكائن "الرئيسي" بمجرد أن يفقد الكائن "الرئيسي" معناه يتم حذف بنية البيانات المرتبطة بشكل طبيعي.