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

الفرق بين الخاصية weakSet و weakMap في الجافاسكريبت

توفيق اسحيمة

السؤال

السلام عليكم

هل من الممكن ان يتشرف احد الاخوة ويشرح لي الخاصية weakset بشكل مبسط وسهل الفهم 

وكدلك ما هو الفرق بينها وبين الخاصية weakMap

جزاكم الله خيرا.

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

Recommended Posts

  • 1

قبل محاولة فهم الأطقم والخرائط ضعيفة الإشارة weakSet و weakMap يجب أولا فهم ما هي الخرائط Maps والأطقم Sets من الأساس. لنقم بتناول كل منهما كالتالي:

  • يمكن فهم الأطقم Sets على أنها تجميعات من القيم الفريدة من أي نوع بيانات (سلسلة نصية، مصفوفة .. الخ). بمعنى أن كل عنصر في هاته التجميعة لا يمكن أن يتكرر ضمن نفس المجموعة. إستعمالات شائعة: 
    // إنشاء طقم 
    const letters = new Set(["أ","ب","ت"]);
    
    // إضافة قيمة جديدة للطقم
    letters.add("ج");
    
    // حذف قيمة من الطقم
    letters.delete("ج");
    
    // التحقق ما كان الطقم يمتلك قيمة ما
    letters.has("ج");
    
    // حذف كامل القيم من الطقم
    letters.clear();
     
  • يمكن فهم الخرائط Maps على أنها تجميعات من القيم معرفة في أزواج مفتاح-قيمة / key-value حيث يمكن أن تكون هاته المفاتيح أي نوع بيانات. 
    // إنشاء خريطة 
    const platforms = new Map([
      ["Mostaql", 500],
      ["Hsoub.io", 300],
      ["Orange", 200]
    ]);
    
    // إضافة قيمة جديدة للخريطة
    platforms.set("Khamsat", 300);
    
    // جلب قيمة من الخريطة عن طريق مفتاحها
    platforms.get("Khamsat");

     

و الأطقم والخرائط ضعيفة الإشارة تختلف عنها من حيث أنها:

  • تقبل تخزين كائنات فقط، لا يمكن تخزين أنواع أولية فيها.
    let visitedSet = new WeakSet();
    
    let john = { name: "John" };
    
    visitedSet.add(john); // مسموح
    visitedSet.add('5'); // غير مسموح

     

  • تمتلك الأطقم والخرائط ضعيفة الإشارة توابع محدودة وأقل من الأطقم والخرائط العادية. توابع مثل keys أو values لن تكون متوفرة.

ما الغرض وراء استعمالها؟

تستعمل أساسا لتخزين البيانات الإضافية المتعلقة بكائن ما. حيث يتم تعيين هذا الكائن كفمتاح لمجموعة البيانات الإضافية الخاصة به. وبالتالي، لو قمنا بمسح هذا الكائن من الذاكرة فستختفي هاته البيانات أيضا. 

ولنقل كمثال، يريد الطالب Jhon تخزين ملف سري يخصه، بشرط أن خروج هذا الطالب سيعني مسح هذا الملف السري. نقوم بذلك كالتالي:

weakMap.set(john, "secret documents");

  أي فقدان للكائن john في التطبيق، سيؤدي إلى مسح القيمة المسندة إليه كمفتاح في الخارطة ضعيفة الإشارة. 

يمكنك الإستزادة بالتعرف عليهما في النوع WeakMap والنوع WeakSet: الخرائط والأطقم ضعيفة الإشارة في جافاسكربت.

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

  • 0

ال weakSet تسمح لك بتخزين objects في مجموعة،  فهي تشبه ال Set يعني أن ما يوجد في المجموعة يكون فريداً من نوعه غير مكرر.

الإختلاف الرئيسي بينها وبين ال Set هو أن WeakSet مجموعة من ال objects فقط. يعني انها لا يمكن أن تحتوي على قيمة من نوع بدائي.

 مثال على ذلك:

const visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };

visitedSet.add(john); // زارنا ‫John
visitedSet.add(pete); // وبعده ‫Pete

visitedSet.add("Mary"); // خطأ
                        // ﻷن القيمة هنا من نوع بياني بدائي
                        // الأنواع  البيانية البدائية هي:
                        //String, Number, BigInt, Boolean, Symbol

أم بالنسبة لل WeakMap فهي مجموعة من الثنائيات كل ثنائية تضم مفتاحاً وقيمة (key و value) فهي تشبه  ال Map لكن الخلاف بينهما يكمن في أن المفتاح (key) يجب أن يكون object لا يمكن أن يكون من أنواع البيانات البدائية.

مثال على ذلك:

const wm1 = new WeakMap(),
      wm2 = new WeakMap();

const o1 = {},
      o2 = function() {};

let obj = {};

wm1.set(o1, 37);
wm1.set(o2, 'azerty');
wm2.set(o1, o2); //القيمة يمكن أن تكون اي شيء، فيمكن أن تكون
                 // object
                 // أو دالة
wm2.set(o3, undefined);

wm2.set(wm1, wm2); // ويمكن أن يكون المفتاح والقيمة عبارة عن
                   // WeakMaps
                   // أيضا

w2.set("test", "Whoops");// خطأ المفتاح لا يمكن أن يكون من نوع  بياني بدائي
                         
                         

 

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

  • 0
بتاريخ 47 دقائق مضت قال مسعود زاهي:

ال weakSet تسمح لك بتخزين objects في مجموعة،  فهي تشبه ال Set يعني أن ما يوجد في المجموعة يكون فريداً من نوعه غير مكرر.

الإختلاف الرئيسي بينها وبين ال Set هو أن WeakSet مجموعة من ال objects فقط. يعني انها لا يمكن أن تحتوي على قيمة من نوع بدائي.

 مثال على ذلك:


const visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };

visitedSet.add(john); // زارنا ‫John
visitedSet.add(pete); // وبعده ‫Pete

visitedSet.add("Mary"); // خطأ
                        // ﻷن القيمة هنا من نوع بياني بدائي
                        // الأنواع  البيانية البدائية هي:
                        //String, Number, BigInt, Boolean, Symbol

أم بالنسبة لل WeakMap فهي مجموعة من الثنائيات كل ثنائية تضم مفتاحاً وقيمة (key و value) فهي تشبه  ال Map لكن الخلاف بينهما يكمن في أن المفتاح (key) يجب أن يكون object لا يمكن أن يكون من أنواع البيانات البدائية.

مثال على ذلك:


const wm1 = new WeakMap(),
      wm2 = new WeakMap();

const o1 = {},
      o2 = function() {};

let obj = {};

wm1.set(o1, 37);
wm1.set(o2, 'azerty');
wm2.set(o1, o2); //القيمة يمكن أن تكون اي شيء، فيمكن أن تكون
                 // object
                 // أو دالة
wm2.set(o3, undefined);

wm2.set(wm1, wm2); // ويمكن أن يكون المفتاح والقيمة عبارة عن
                   // WeakMaps
                   // أيضا

w2.set("test", "Whoops");// خطأ المفتاح لا يمكن أن يكون من نوع  بياني بدائي
                         
                         

 

شكرا لك على اهتمامك اخي

شرح ممتاز

من ناحية الكود تقريبا فهمته 

لكن ما اود ان اعرفه بالتحديد هو متى نحتاج استخدام هاته الخاصيات  map set weakMap weakset 

شكرا لك.

بتاريخ 24 دقائق مضت قال Adnane Kadri:

قبل محاولة فهم الأطقم والخرائط ضعيفة الإشارة weakSet و weakMap يجب أولا فهم ما هي الخرائط Maps والأطقم Sets من الأساس. لنقم بتناول كل منهما كالتالي:

  • يمكن فهم الأطقم Sets على أنها تجميعات من القيم الفريدة من أي نوع بيانات (سلسلة نصية، مصفوفة .. الخ). بمعنى أن كل عنصر في هاته التجميعة لا يمكن أن يتكرر ضمن نفس المجموعة. إستعمالات شائعة: 
    
    // إنشاء طقم 
    const letters = new Set(["أ","ب","ت"]);
    
    // إضافة قيمة جديدة للطقم
    letters.add("ج");
    
    // حذف قيمة من الطقم
    letters.delete("ج");
    
    // التحقق ما كان الطقم يمتلك قيمة ما
    letters.has("ج");
    
    // حذف كامل القيم من الطقم
    letters.clear();
     
  • يمكن فهم الخرائط Maps على أنها تجميعات من القيم معرفة في أزواج مفتاح-قيمة / key-value حيث يمكن أن تكون هاته المفاتيح أي نوع بيانات. 
    
    // إنشاء خريطة 
    const platforms = new Map([
      ["Mostaql", 500],
      ["Hsoub.io", 300],
      ["Orange", 200]
    ]);
    
    // إضافة قيمة جديدة للخريطة
    platforms.set("Khamsat", 300);
    
    // جلب قيمة من الخريطة عن طريق مفتاحها
    platforms.get("Khamsat");

     

و الأطقم والخرائط ضعيفة الإشارة تختلف عنها من حيث أنها:

  • تقبل تخزين كائنات فقط، لا يمكن تخزين أنواع أولية فيها.
    
    let visitedSet = new WeakSet();
    
    let john = { name: "John" };
    
    visitedSet.add(john); // مسموح
    visitedSet.add('5'); // غير مسموح

     

  • تمتلك الأطقم والخرائط ضعيفة الإشارة توابع محدودة وأقل من الأطقم والخرائط العادية. توابع مثل keys أو values لن تكون متوفرة.

ما الغرض وراء استعمالها؟

تستعمل أساسا لتخزين البيانات الإضافية المتعلقة بكائن ما. حيث يتم تعيين هذا الكائن كفمتاح لمجموعة البيانات الإضافية الخاصة به. وبالتالي، لو قمنا بمسح هذا الكائن من الذاكرة فستختفي هاته البيانات أيضا. 

ولنقل كمثال، يريد الطالب Jhon تخزين ملف سري يخصه، بشرط أن خروج هذا الطالب سيعني مسح هذا الملف السري. نقوم بذلك كالتالي:


weakMap.set(john, "secret documents");

  أي فقدان للكائن john في التطبيق، سيؤدي إلى مسح القيمة المسندة إليه كمفتاح في الخارطة ضعيفة الإشارة. 

يمكنك الإستزادة بالتعرف عليهما في النوع WeakMap والنوع WeakSet: الخرائط والأطقم ضعيفة الإشارة في جافاسكربت.

شكرا على اهتمامك اخي

اود بالتحديد معرفة اكثر واهم الحالات التي نحتاج فيها لاستخدام هاته الخصائص بعيدا عن الكود 

اود ان افهمهم بمعنى عامي حتى يترسخوا بداكرتي

اتمنى ان اكون قد وفقت في طرح تساؤلي.

شكرا.

بتاريخ 58 دقائق مضت قال مسعود زاهي:

ال weakSet تسمح لك بتخزين objects في مجموعة،  فهي تشبه ال Set يعني أن ما يوجد في المجموعة يكون فريداً من نوعه غير مكرر.

الإختلاف الرئيسي بينها وبين ال Set هو أن WeakSet مجموعة من ال objects فقط. يعني انها لا يمكن أن تحتوي على قيمة من نوع بدائي.

 مثال على ذلك:


const visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };

visitedSet.add(john); // زارنا ‫John
visitedSet.add(pete); // وبعده ‫Pete

visitedSet.add("Mary"); // خطأ
                        // ﻷن القيمة هنا من نوع بياني بدائي
                        // الأنواع  البيانية البدائية هي:
                        //String, Number, BigInt, Boolean, Symbol

أم بالنسبة لل WeakMap فهي مجموعة من الثنائيات كل ثنائية تضم مفتاحاً وقيمة (key و value) فهي تشبه  ال Map لكن الخلاف بينهما يكمن في أن المفتاح (key) يجب أن يكون object لا يمكن أن يكون من أنواع البيانات البدائية.

مثال على ذلك:


const wm1 = new WeakMap(),
      wm2 = new WeakMap();

const o1 = {},
      o2 = function() {};

let obj = {};

wm1.set(o1, 37);
wm1.set(o2, 'azerty');
wm2.set(o1, o2); //القيمة يمكن أن تكون اي شيء، فيمكن أن تكون
                 // object
                 // أو دالة
wm2.set(o3, undefined);

wm2.set(wm1, wm2); // ويمكن أن يكون المفتاح والقيمة عبارة عن
                   // WeakMaps
                   // أيضا

w2.set("test", "Whoops");// خطأ المفتاح لا يمكن أن يكون من نوع  بياني بدائي
                         
                         

 

تلميح

اود بالتحديد معرفة اكثر واهم الحالات التي نحتاج فيها لاستخدام هاته الخصائص بعيدا عن الكود 

اود ان افهمهم بمعنى عامي حتى يترسخوا بداكرتي

اتمنى ان اكون قد وفقت في طرح تساؤلي.

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

  • 0

لا شكر على واجب أخي. سؤال مهم متى نستمع هذه الخواص أظن أن الأمر يحتاج إلى أمثلة لتوضيح إستعمالات كل خاصية:

  • ال Set نستعملها عادة لتخزين قيم غير مكررة ذات أنواع مختلفة، بدائية (primitive) كانت أو كائنات (objects)
var set1 = new Set();
set1.add('a');  // ==> Set { 'a' }
set1.add(1);  // ==> Set { 'a', 1 }
set1.add('1'); // ==> Set { 'a', 1, '1' }

// القيمة 1 أضيفت سابقا
set1.add(1); // ==> Set { 'a', 1, '1’ }

//يمكننا أيضا تخزين الكائنات
var obj1 = { prop1: 'Hello!' };
set1.add(obj1); // ==> Set { 'a', 1, '1', { prop1: 'Hello!' } }
  • ال WeakSet نستعملها عندما نحتاج فقط لتخزين كائنات (objects) غير مكررة ( لا يمكن تخزين قيم بدائية)
const ws = new WeakSet();
const foo = {};
const bar = {};

ws.add(foo);
ws.add(bar);

ws.has(foo);    // true: موجود
ws.has(bar);    // true: موجود

ws.delete(foo); // حذف foo
ws.has(foo);    // false, غير موجود
ws.has(bar);    // true, موجود
  •  ال Map نستعملها لتخزين ثنائيات ( مفتاح + قيمة).  
var map1 = new Map();

//القيمة قد تكون أولية مثل 
//string
map1.set(1, 'hello'); // ==> Map { 1 => 'hello’ }

// القيمة قد تكون كائن
map1.set('jimmy', {x: 'y'}) // ==> Map { 1 => 'hello', 'jimmy' => { lastName: 'farrell' } }


// وقد تكون مجموعة
var arr1 = ['a', 'b'];
map1.set(arr1, [1, 2]); // ==> Map { 1 => 'hello', 'jimmy' => { x: 'y' }, [ 'a', 'b' ] => [ 1, 2 ] }
  • ال WeakMap أيضا نستعملها لتخزين ثنائيات ( مفتاح + قيمة) غير أن المفتاح يجب أن يكون كائنا (Object)
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...