Map و Set
الشراب يُحفظ في Map تحت اسم الضيف. الإضافات تذهب إلى Set، وكل إضافة تبقى مرة واحدة. طلب lida يبدأ بـ tea ثم يحل mint محل ذلك الشراب. تدخل mint و lemon في المجموعة. سطر الصفحة يُقرأ lida / mint / 2.
صفحة الوضع الصارم كانت مساراً آخر
هناك ظهر ReferenceError لأن اسماً لم يُعلَن. هذه الصفحة لا ترمي شيئاً. المفتاح الذي لا وجود له يعيد get له القيمة undefined.
المفتاح نفسه يُكتب فوق قيمته
orders.set("lida", "tea") يضع الشراب الأول. orders.set("lida", "mint") لا يفتح صفاً ثانياً، بل يستبدل ما تحت ذلك المفتاح. size يعدّ المفاتيح، لا عدد نداءات set.
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
console.log(orders.get("lida"));
console.log(orders.size);
السجل يطبع mint ثم 1. لم يُخزَّن nima، لذلك orders.get("nima") يساوي undefined. orders.has("lida") يساوي true. اقرأ الخريطة بـ get. الصيغتان orders.lida و orders["lida"] تخصّان الكائن العادي ولا تقرآن هذه الخريطة.
المفتاح هو الكائن، لا نص حقوله
يجوز لمفتاح الخريطة أن يكون كائناً. ما يُحتفظ به هو ذلك الكائن، لا سلسلة مبنية من حقوله. كائن آخر يحمل الحقول نفسها يبقى مفتاحاً مختلفاً.
const cup = { guest: "lida" };
const other = { guest: "lida" };
const orders = new Map();
orders.set(cup, "tea");
console.log(orders.get(cup));
console.log(orders.get(other));
console.log(orders.size);
السجل يطبع tea ثم undefined ثم 1. الكائن العادي كان سيحوّل المفتاحين كليهما إلى النص "[object Object]"، فتمسح الكتابة الثانية الأولى. Map لا تفعل ذلك.
النسخة الثانية من mint تسقط
نداء add("mint") مرتين يُبقي mint واحدة. lemon قيمة ثانية، فيصير size مساوياً 2. الدالة has تجيب بنعم أو لا، ولا تعيد القيمة نفسها.
const extras = new Set();
extras.add("mint");
extras.add("mint");
extras.add("lemon");
console.log(extras.size);
console.log(extras.has("lemon"));
السجل يطبع 2 ثم true. البناء new Set(["mint", "mint", "lemon"]) يعطي المجموعة نفسها، لأن نسخة mint الزائدة سقطت من قبل. في Set قيم فقط، ولا يُحفظ شراب تحت اسم ضيف.
delete يسحب مدخلاً واحداً
إذا أزال شيئاً أعاد true. إذا كانت القيمة غائبة أعاد false، والمجموعة تبقى كما كانت.
const extras = new Set(["mint", "lemon"]);
console.log(extras.delete("lemon"));
console.log(extras.size);
console.log(extras.has("lemon"));
السجل يطبع true ثم 1 ثم false. ما زالت mint في مكانها. لدى Map أيضاً delete و has، لكنهما يعملان بالمفتاح: orders.delete("lida") يزيل ذلك الضيف.
ما يُكتب على الصفحة
يُستبدل شراب lida، وتُبنى المجموعة من ثلاث كلمات، ثم يُكتب الضيف والشراب و size.
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
const extras = new Set(["mint", "mint", "lemon"]);
const line = document.querySelector("#line");
line.textContent = "lida / " + orders.get("lida") + " / " + extras.size;
</script>
</body>
</html>
القراءة هي lida / mint / 2. النداء الأول الذي وضع tea لا يظهر. تكرار mint لا يرفع size. كان ReferenceError سطر صفحة الوضع الصارم.
خمس حركات عند الطاولة
- اجعل lida على tea ثم على mint. يصير get("lida") هو mint ويبقى size عند 1.
- ضع tea تحت cup. يكون get(other) هو undefined ويبقى size عند 1.
- أضف mint ثم mint ثم lemon. يصير size هو 2 و has("lemon") هو true.
- احذف lemon. يصير size هو 1 و has("lemon") هو false.
- اقرأ الصفحة. السطر هو lida / mint / 2.
ما يختلط، وما يبقى
النداء الثاني لـ set على المفتاح نفسه تحديث. الإضافة الثانية للإضافة عينها تُهمل.
- لا تقرأ الخريطة بصيغة orders["lida"]
- كائنان متشابهان ليسا مفتاحاً واحداً
- has لا يعيد الشراب
- new Set يسقط النسخ منذ البداية
- لا تقرأ السطر كأنه ReferenceError
في الذهن
- set يستبدل و size يبقى
- مفاتيح الكائنات هي الكائنات ذاتها
- Set يبقي كل قيمة مرة واحدة
- delete يزيل مدخلاً واحداً
- سطر الصفحة هو lida / mint / 2
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى