؟ المراجع القوية في جافا سكريبت: مرجع الكائن هو مرجع قوي في جافا سكريبت، أي أنه عندما将一个引用对象通过变量或常量保存
، فإن المتغير أو الثابت هو مرجع قوي. ولن يكون الكائن سلة المحذوفات.
المراجع الضعيفة في JavaScript: WeakMaps وWeakSets هي الطرق الوحيدة التي يمكننا من خلالها استخدام المراجع الضعيفة في JavaScript.将一个对象作为键添加
إلى WeakMap أو WeakSet لا يمنع إعادة تدوير هذه الكائنات.
هو طفل يحمل كلبًا، ويرتبطان بسلسلة كلب.
والإشارة الضعيفة أن يكون شخص (ب) يشير إلى الكلب الذي يحمله (أ) ويقول: يا هذا كلب هناك، ويشير (ب) إلى الكلب، وليس بينهما شيء.
عندما يترك "أ" مقود الكلب، سيهرب الكلب بعيدًا (تم جمع القمامة)، بغض النظر عما إذا كان "ب" لا يزال يشير أم لا.
ومع ذلك، عندما لا يشير B إلى الكلب، يظل الكلب محتجزًا بواسطة A، مما لن يؤثر على ما إذا كان سيهرب أم لا.
دع الأشخاص = {name:'Zhang San',age:25} Let People1 = people;
في الكود أعلاه، عندما نخصص {name:'张三',age:25}
للمتغير People، سيكون هناك خط يربطهم في الذاكرة:
ثم قم بإنشاء المتغير People1 وقم بتعيين الأشخاص إلى الأشخاص 1، وهو ما يعادل الأشخاص 1 الذين يشيرون أيضًا إلى هذا الكائن:
دعونا نلقي نظرة على ما يحدث عندما نستخدم الأنواع المقدمة حديثًا WeakSet وWeakMap في ES6 لتخزين القيم المرجعية.
دع الناس = {الاسم: "تشانغ سان"، العمر: 25} دع الناس 1 = الناس؛ Let set = new WeakSet(); set.add(people);
أنشأنا نسخة WeakSet() جديدة وأضفنا أشخاصًا من خلال طريقة الإضافة. القيمة المرجعية المقابلة للأشخاص هي {name:'张三',age:25}
.
يمكن ملاحظة أن القيمة {name:'张三',age:25}
في المثيل المحدد تشير إلى {name:'张三',age:25}
(في الذاكرة الفعلية، تشير إلى مكدس البيانات مرجع المؤشر، يشير المكدس إلى قيمة العنوان المقابل في الكومة المقابلة). ومن المهم أن نلاحظ أن هذا "الخط" من المراجع الضعيفة شفاف. ماذا يعني هذا؟ ما الفرق بينه وبين الاقتباس القوي؟
ملخص جملة واحدة: يتم التعرف على المرجع القوي على أنه "اتصال" بواسطة المرجع {name:'张三',age:25}
، بينما لا يتم التعرف على المرجع الضعيف. أي أن المرجع لا يعرف أنه تمت الإشارة إليه بواسطة المثيل المحدد.
هذا يعني أن مجموعة البيانات المهملة لا تعرف أنه تمت الإشارة إلى المرجع بواسطة المثيل المحدد. ثم إذا تم قطع جميع الاتصالات المرجعية القوية للمرجع (تم تعيين المتغير على أنه فارغ أو لظروف أخرى)، فسيتم تدمير المرجع كقمامة، حتى لو كان المثيل المحدد لا يزال يشير إلى المرجع.
دع الناس = {الاسم: "تشانغ سان"، العمر: 25} دع الناس 1 = الناس؛ Let set = new WeakSet(); set.add(people); People = null; People1 = null;
ماذا سيحدث إذا قمنا بفصل جميع المراجع القوية؟
نظرًا لفصل كافة المراجع القوية، ترى مجموعة البيانات المهملة أن المرجع {name:'张三',age:25}
لم تعد هناك حاجة إليه، وسوف تدمره. ثم لم يعد المرجع الذي يستخدمه مثيل المجموعة المقابل موجودًا، حتى لو كان مثيل المجموعة لا يزال يستخدم المرجع.
1. المرجع إلى الكائن في WeakSet هو مرجع ضعيف، وهذا يعني أنه حتى لو كانت المجموعة الضعيفة "تشير" إلى كائن ما، فإن جمع البيانات المهملة لا يحسب هذا المرجع على أنه "مرجع". طالما لا توجد مراجع قوية في مكان آخر، لا يمكن الوصول إلى هذا الكائن ويمكن إعادة تدويره في أي وقت، ويمكنه تخزين أنواع المراجع فقط ولا يمكن تعداده أو مسحه.
2. WeakMap مشابه للخريطة، لكنه غير قابل للتعداد، ولا يمكن مسحه، والكائن المشار إليه بالمفتاح هو مرجع ضعيف.
3. WeakSet مناسب للتخزين المؤقت لمجموعة من الكائنات وتخزين المعلومات المرتبطة بالكائنات. طالما أن هذه الكائنات تختفي خارجيًا، فإن مراجعها في WeakSet ستختفي تلقائيًا. نظرًا للخصائص المذكورة أعلاه، فإن أعضاء WeakSet غير مناسبين كمرجع لأنهم سيختفون في أي وقت.
4. تنسى المراجع القوية أحيانًا إلغاء الإشارة، مما يتسبب في عدم القدرة على تحرير الذاكرة، مما قد يتسبب في تسرب الذاكرة. لا يتم تضمين المراجع الضعيفة في آلية جمع البيانات المهملة، لذلك لا توجد هذه المشكلة.