اذهب إلى المحتوى
  • 0

استخدامات الWeakSet والWeakMap في لغة JS.

Muhannad Abbara

السؤال

Recommended Posts

  • 0

الأمر بسيط، فكر بالأمر من ناحية مدلوله اللغوي وستجده بسيطا.

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 تمتلك نفس المضمون غير أن القيم فيها تخزن كزوج قيمة - مفتاح، اذ يمكن استخدام أي نوع من البيانات كمفتاح أو قيمة.

قد يكون من الأفضل الاستزادة بالاطلاع على المقالة التالية:

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الـ 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.

وأنصحك بقراءة التالي:

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...