ببساطة، إذا كان المتغير أو الكائن "غير قابل للوصول"، فليست هناك حاجة لمواصلة تخزين المتغير أو الكائن في الذاكرة ويجب إعادة تدويره.
على سبيل المثال:
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
بالكائن "الرئيسي" بمجرد أن يفقد الكائن "الرئيسي" معناه يتم حذف بنية البيانات المرتبطة بشكل طبيعي.