در حال بارگذاری...

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 را صدا زده‌ای.

عوض کردن یک نوشیدنی

javascript
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
console.log(orders.get("lida"));
console.log(orders.size);

لاگ‌ها mint و بعد 1 هستند. orders.get("nima") برابر undefined است، چون این کلید ذخیره نشده. orders.has("lida") برابر true است. نقشه را با get بخوان. orders.lida و orders["lida"] نحو شیء هستند و این نقشه را نمی‌خوانند.

دو شیء، دو کلید

کلید نقشه می‌تواند خود شیء باشد. نقشه همان شیء را نگه می‌دارد، نه رشته‌ای که از فیلدهایش ساخته شود. شیء دیگری با همان فیلدها کلید دیگری است.

کلیدهای شیء جدا می‌مانند

javascript
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]" تبدیل می‌کند و نوشتن دوم، اولی را پاک می‌کند. نقشه این کار را نمی‌کند.

مجموعه نسخهٔ تکراری را دور می‌ریزد

دو بار add("mint") باز هم یک mint است. lemon مقدار دوم است، پس size برابر 2 می‌شود. has فقط بله یا خیر می‌گوید و خود مقدار را برنمی‌گرداند.

اضافه‌های یکتا

javascript
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 از اول کنار گذاشته شده. مجموعه فقط مقدار دارد. نوشیدنی را زیر نام مهمان ذخیره نمی‌کند.

delete همان یک عضو را برمی‌دارد

اگر چیزی حذف شده باشد delete مقدار true برمی‌گرداند. اگر آن مقدار نباشد false برمی‌گردد و مجموعه همان‌طور می‌ماند.

برداشتن lemon

javascript
const extras = new Set(["mint", "lemon"]);
console.log(extras.delete("lemon"));
console.log(extras.size);
console.log(extras.has("lemon"));

لاگ‌ها true، بعد 1، بعد false هستند. mint هنوز هست. نقشه هم delete و has دارد، ولی با کلید: orders.delete("lida") همان مهمان را برمی‌دارد.

خط صفحه

صفحه نوشیدنی lida را عوض می‌کند، مجموعه را از سه کلمه می‌سازد، و مهمان و نوشیدنی و اندازه را می‌نویسد.

نمایش صفحه — نقشه و مجموعه

html
<!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 است. set اول که tea بود دیده نمی‌شود، چون set دوم جایش را گرفته. mint تکراری اندازه را بالا نمی‌برد. ReferenceError خط صفحهٔ حالت سخت‌گیرانه بود.

پشت پیشخوان

  1. lida را tea بگذار، بعد mint. get("lida") برابر mint است و size برابر 1.
  2. tea را زیر cup ذخیره کن. get(other) برابر undefined است و size همان 1 می‌ماند.
  3. mint و mint و lemon را اضافه کن. size برابر 2 است و has("lemon") برابر true.
  4. lemon را حذف کن. size برابر 1 است و has("lemon") برابر false.
  5. صفحه را بخوان. خط lida / mint / 2 است.

جاهایی که اشتباه می‌شود

set دوم روی همان کلید مهمان تازه نیست؛ به‌روزرسانی است. add دوم برای همان اضافه نادیده گرفته می‌شود.

  • خواندن نقشه با orders["lida"]
  • یکی گرفتن دو شیء شبیه هم
  • انتظار اینکه has خود نوشیدنی را برگرداند
  • فراموش کردن اینکه new Set از اول کپی را حذف می‌کند
  • خواندن خط به‌شکل ReferenceError

این‌ها را نگه دار

  • set روی کلید موجود مقدار را عوض می‌کند و size همان می‌ماند
  • کلید شیء با خود شیء مقایسه می‌شود، نه با فیلدهایش
  • مجموعه هر مقدار را یک بار نگه می‌دارد
  • delete یک عضو را برمی‌دارد و بعد has برابر false است
  • خط صفحه lida / mint / 2 است

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
4
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود