Muhannad Abbara نشر 18 يوليو 2023 أرسل تقرير نشر 18 يوليو 2023 السلام عليكم ما هو الفرق بين الSet والWeakSet. وما هو الفرق بين الMap والWeakMap. وما هي الحالات التي تصلح لاستخدام الWeakSet والWeakMap. شكرا لكم 1 اقتباس
0 Adnane Kadri نشر 18 يوليو 2023 أرسل تقرير نشر 18 يوليو 2023 الأمر بسيط، فكر بالأمر من ناحية مدلوله اللغوي وستجده بسيطا. Set: يُعد Set هو عبارة عن هيكل بيانات يسمح بتخزين مجموعة من القيم المميزة (فريدة) بدون تكرار. يمكن للعناصر في Set أن تكون من أي نوع من أنواع البيانات مثل الأرقام والسلاسل والأشياء الأخرى. يتيح لنا طرقًا لإضافة عناصر جديدة وإزالة العناصر الحالية والبحث عن عناصر معينة. مثال: // إنشاء مجموعة Set const mySet = new Set(); // إضافة عناصر إلى المجموعة mySet.add(10); mySet.add('Hello'); mySet.add({ name: 'John', age: 25 }); // الحصول على عدد العناصر في المجموعة console.log(mySet.size); // الناتج: 3 // التحقق مما إذا كانت المجموعة تحتوي على عنصر معين console.log(mySet.has('Hello')); // الناتج: true // إزالة عنصر من المجموعة mySet.delete(10); // تحويل Set إلى مصفوفة const myArray = [...mySet]; console.log(myArray); // الناتج: ['Hello', { name: 'John', age: 25 }] WeakSet: هو نوع خاص من Set المرجع فيه ضعيف Weak، يعني هذا أن أن العناصر في WeakSet قابلة للتدمير إذا لم يتم الاحتفاظ بها بشكل آخر ككائن في البرنامج / التطبيق. كما أن العناصر في WeakSet من نوع الكائنات فقط. مثال: // إنشاء مجموعة WeakSet const myWeakSet = new WeakSet(); // إنشاء كائنين لاستخدامهما كمفاتيح في WeakSet const key1 = { id: 1 }; const key2 = { id: 2 }; // إضافة الكائنات إلى المجموعة myWeakSet.add(key1); myWeakSet.add(key2); // الكائنات في myWeakSet تكون مرتبطة فقط بمجموعة الضعيف وليس لديها تأثير على جمع القمامة // التحقق مما إذا كان الكائن موجودًا في المجموعة console.log(myWeakSet.has(key1)); // الناتج: true // إزالة الكائن من المجموعة (لا يمكن القيام بهذا بشكل مباشر) // يمكنك إعادة تعيين المتغير الذي يحمل الكائن (مفتاح) ليصبح `null` لتمكين جمع القمامة key1 = null; // تحويل WeakSet إلى مصفوفة غير ممكن بسبب طبيعة WeakSet وعدم وجود إشارة ثابتة للكائنات الداخلة فيه وهذا بخصوص الأطقم أو Sets. الخرائط Maps تمتلك نفس المضمون غير أن القيم فيها تخزن كزوج قيمة - مفتاح، اذ يمكن استخدام أي نوع من البيانات كمفتاح أو قيمة. قد يكون من الأفضل الاستزادة بالاطلاع على المقالة التالية: 1 اقتباس
0 Mustafa Suleiman نشر 19 يوليو 2023 أرسل تقرير نشر 19 يوليو 2023 الـ Set هي مجموعة من العناصر الفريدة، حيث يمكن أن تكون العناصر من أي نوع، بما في ذلك الكائنات والأرقام والأحرف والسلاسل، وتستطيع الوصول إلى العناصر في الـ Set عن طريق معرفها، أو عن طريق تكرار جميع العناصر في المجموعة. مثال عن تخزين قائمة من الأرقام باستخدام Set: const set = new Set([1, 2, 3, 4, 5]); // set.has(3) // true // set.has(6) // false تحتوي المجموعة set على الأرقام 1 و 2 و 3 و 4 و 5. لا تحتوي المجموعة على الرقم 6. الـ WeakSet هي مجموعة من الكائنات فقط، ولا يمكن الوصول إلى العناصر في الWeakSet إلا من خلال معرفها، مما يعني أن العناصر في الWeakSet لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى. الـ Map هي مجموعة من الأزواج، ويكون كل زوج مكونًا من مفتاح وقيمة، وبالإمكان أن تكون المفاتيح في الMap من أي نوع، بما في ذلك الكائنات والأرقام والأحرف والسلاسل، ويتم الوصول إلى القيم في الMap عن طريق معرف المفتاح، أو عن طريق تكرار جميع الأزواج في المجموعة. تخزين قائمة من الكائنات باستخدام Map: const map = new Map([ [1, "Object 1"], [2, "Object 2"], [3, "Object 3"] ]); // map.get(1) // "Object 1" // map.get(4) // undefined تحتوي الخريطة map على الكائنات { id: 1, name: "Object 1" } و { id: 2, name: "Object 2" } و { id: 3, name: "Object 3" }. لا تحتوي الخريطة على الكائن { id: 4, name: "Object 4" }. الـ WeakMap عبارة عن مجموعة من الكائنات فقط، ونصل إلى القيم في الـ WeakMap فقط عن طريق معرف المفتاح.، أي أن القيم في الWeakMap لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى. والحالات التي تصلح لاستخدام الـ WeakSet والـ WeakMap هي للتعامل مع الكائنات التي لا يجب أن تتم إدارتها أو جمعها من قبل (Garbage Collector - GC) في لغات البرمجة التي تدعم تلك الهياكل ومنها جافاسكريبت. مثلاً قد تستخدم الـ WeakSet لتخزين قائمة بالمراجع إلى الكائنات التي تم إنشاؤها مؤقتًا، بحيث يتم حذف هذه الكائنات بمجرد عدم استخدامها بعد الآن، ونستخدم الـ WeakMap لتخزين مجموعة من الإعدادات، بحيث يتم حذف الإعدادات بمجرد عدم استخدامها بعد الآن. أيضًا تستخدم الـ WeakSet والـ WeakMap للتعامل مع الكائنات التي لا ينبغي الوصول إليها إلا من خلال طريقة معينة، أي نستخدم الـ WeakSet لتخزين قائمة بالمراجع إلى الكائنات التي لا ينبغي الوصول إليها إلا من خلال طريقة معينة، بحيث لا يمكن الوصول إلى هذه الكائنات من أي طريقة أخرى، ونستخدم الـ WeakMap لتخزين مجموعة من الإعدادات، بحيث لا يمكن الوصول إلى هذه الإعدادات إلا من خلال طريقة معينة. وإليك مثال عن تخزين قائمة من الكائنات التي تم إنشاؤها مؤقتًا: const weakSet = new WeakSet(); const obj1 = { id: 1, name: "Object 1" }; const obj2 = { id: 2, name: "Object 2" }; weakSet.add(obj1); weakSet.add(obj2); // delete obj1; // weakSet.has(obj1) // false // weakSet.has(obj2) // true كما ترى، تم حذف الكائن obj1 من مجموعة weakSet، لأنه لم يكن هناك كائنات أخرى تشير إليه. تخزين مجموعة من الإعدادات: const weakMap = new WeakMap(); const setting1 = { key: "key1", value: "value1" }; const setting2 = { key: "key2", value: "value2" }; weakMap.set(setting1, setting1.value); weakMap.set(setting2, setting2.value); // delete setting1; // weakMap.get(setting1) // undefined // weakMap.get(setting2) // "value2" كما ترى، لم يعد بإمكاننا الحصول على قيمة setting1 من مجموعة weakMap، لأنه لم يكن هناك كائنات أخرى تشير إليه، ولكن، لا يزال بإمكاننا الحصول على قيمة setting2. وأنصحك بقراءة التالي: اقتباس
السؤال
Muhannad Abbara
السلام عليكم
شكرا لكم
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.