Symbol ibtidoiy turi va uning noyobligi, Map va Object farqlari, ob'ektlarni kalit sifatida ishlatish, Set orqali noyob to'plamlar, size va length farqi hamda WeakMap/WeakSet.
Bu bob bilan PART 6 (Modern JavaScript) yakunlanadi. Bu bobda ES6'da qo'shilgan, ammo kamroq ma'lum bo'lgan uchta muhim vosita — Symbol, Map va Setni o'rganamiz.
Symbol — Chapter 2'da o'rgangan 7 ta primitive data type'dan biri (typeof value === "symbol"), va uning eng muhim xususiyati: har bir yaratilgan Symbol — butunlay noyob (unique), hech qachon boshqasiga teng bo'lmaydi.
script.jsJavaScriptlet sym1 = Symbol("id");let sym2 = Symbol("id");console.log(sym1 === sym2); // false — hatto bir xil tavsif bilan ham!
Garchi ikkalasi ham bir xil "id" tavsifi bilan yaratilgan bo'lsa-da, ular — ikkita butunlay boshqa qiymat. Bu — string yoki sonlardan ("id" === "id" — true) tubdan farq qiladi.
script.jsJavaScriptlet user = {name: "Ali"};let uniqueId = Symbol("id");user[uniqueId] = 12345;console.log(user); // { name: "Ali", [Symbol(id)]: 12345 }
Symbol'lar ko'pincha object'ga boshqa kod bilan hech qachon to'qnashmaydigan noyob "yashirin" propertylar qo'shish uchun ishlatiladi — bu, masalan, kutubxonalar o'z ichki ma'lumotlarini foydalanuvchi object'lariga xavfsiz "qo'shib qo'yish" uchun foydalidir.
💡 Key Idea
Symbol bilan yaratilgan propertylar — oddiy for...in yoki Object.keys() orqali ko'rinmaydi, bu ularni "yarim-yashirin" qiladi.
Map — Chapter 8'dagi oddiy object'ga o'xshaydi (kalit-qiymat juftliklarini saqlaydi), lekin bir nechta muhim afzalliklarga ega.
| Xususiyat | Object | Map |
|---|---|---|
| Kalit turi | Faqat string/Symbol | Istalgan tur (object, function, son va h.k.) |
| Tartib | Kafolatlanmagan (eski brauzerlarda) | Har doim qo'shilish tartibida |
| O'lchamni bilish | Object.keys(obj).length | map.size (to'g'ridan-to'g'ri) |
| Iteratsiya | for...in (murakkabroq) | To'g'ridan-to'g'ri for...of |
script.jsJavaScriptlet userRoles = new Map();userRoles.set("Ali", "admin");userRoles.set("Vali", "user");console.log(userRoles.get("Ali")); // "admin"console.log(userRoles.size); // 2console.log(userRoles.has("Vali")); // trueuserRoles.delete("Vali");console.log(userRoles.size); // 1
Bu — Map'ning eng noyob va kuchli xususiyati, oddiy object bilan mutlaqo imkonsiz bo'lgan narsa:
script.jsJavaScriptlet user1 = { name: "Ali" };let user2 = { name: "Vali" };let userScores = new Map();userScores.set(user1, 95);userScores.set(user2, 88);console.log(userScores.get(user1)); // 95
Oddiy object'da, kalit sifatida faqat string (yoki Symbol) ishlatish mumkin — agar object'ni kalit sifatida berilsa, u avtomatik ravishda "[object Object]" stringiga aylantiriladi (Chapter 36.4'da shunga o'xshash muammoni ko'rgan edik). Map bilan esa, haqiqiy object'larning o'zi to'g'ridan-to'g'ri, noyob kalit sifatida ishlatilishi mumkin.
script.jsJavaScriptfor (let [key, value] of userRoles) {console.log(key + ": " + value);}
🔗 Connection
Bu — Chapter 16'da o'rgangan Array Destructuring'ning Map bilan qo'llanilishi: har bir Map elementi — [key, value] juftligi sifatida keladi.
Set — Chapter 7'dagi array'ga o'xshaydi, lekin unda hech qachon takrorlanuvchi qiymatlar bo'lmaydi.
script.jsJavaScriptlet numbers = new Set([1, 2, 2, 3, 3, 3, 4]);console.log(numbers); // Set(4) {1, 2, 3, 4} — takrorlanganlar avtomatik olib tashlanganconsole.log(numbers.size); // 4
| Metod | Vazifasi |
|---|---|
add(value) | Qiymat qo'shadi |
has(value) | Mavjudligini tekshiradi |
delete(value) | Qiymatni o'chiradi |
size | Elementlar soni |
Bu — Chapter 7'ning "Hard" mashqida qo'lda yozilgan vazifaning ancha oson yechimi:
script.jsJavaScriptlet numbersWithDuplicates = [1, 2, 2, 3, 4, 4, 5];let uniqueNumbers = [...new Set(numbersWithDuplicates)];console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
new Set(array) — array'ni avtomatik ravishda faqat noyob qiymatlarga "tozalaydi". Spread operator (Chapter 16) — Set'ni qayta array'ga aylantiradi.
🔥 Important
Bu — takrorlanuvchi elementlarni olib tashlashning eng qisqa va samarali usuli, oldingi (Chapter 7) qo'lda includes() bilan yozilgan usuldan ancha tezroq va qisqaroq.
Ko'p yangi boshlovchilar Map/Set'da ham .length ishlatishga urinishadi, lekin bu ishlamaydi.
script.jsJavaScriptlet mySet = new Set([1, 2, 3]);console.log(mySet.length); // undefined!console.log(mySet.size); // 3 — to'g'ri
⚠️ Common Mistake
Qoida: Array'larda — .length, Map/Set'larda — .size. Bu ikkisini chalkashtirish — eng ko'p uchraydigan xatolardan biri.
WeakMap va WeakSet — Map/Setga juda o'xshaydi, lekin ularning kalitlari (yoki elementlari) faqat object bo'lishi mumkin, va agar boshqa hech qayerda o'sha object'ga havola qolmasa, Garbage Collector uni avtomatik xotiradan tozalaydi.
🔗 Connection
Bu — xotira boshqaruvi bilan bog'liq ilg'or mavzu, Chapter 43'da (Memory Management) biroz chuqurroq to'xtalamiz. Kundalik dasturlashda oddiy Map/Set yetarli bo'ladi.
Task:
new Set([1, 1, 2, 2, 3]) yordamida Set yarating va uning sizeini konsolga chiqaring.
Required Concepts:
Setlet s = new Set([1, 1, 2, 2, 3]); console.log(s.size);Task:
Map yordamida 3 ta mahsulot va ularning narxlarini saqlang ("olma" → 5000, "non" → 3000, "sut" → 8000). for...of bilan barcha mahsulot va narxlarni chiqaring.
Required Concepts:
Map, for...of destructuringTask:
Ikkita array berilgan. Set yordamida ularning kesishmasi (ikkalasida ham mavjud elementlar)ni toping, filter() va has() metodlaridan foydalaning:
script.jsJavaScriptlet arr1 = [1, 2, 3, 4, 5];let arr2 = [3, 4, 5, 6, 7];// Natija: [3, 4, 5]
Required Concepts:
Set.has()filter() (Chapter 14)let set2 = new Set(arr2); let intersection = arr1.filter(x => set2.has(x));script.jsJavaScriptlet obj1 = { name: "A" };let obj2 = { name: "A" };let objectMap = {};objectMap[obj1] = "birinchi";objectMap[obj2] = "ikkinchi";console.log(Object.keys(objectMap).length);let realMap = new Map();realMap.set(obj1, "birinchi");realMap.set(obj2, "ikkinchi");console.log(realMap.size);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 1 2Why?
Oddiy object (objectMap) — obj1 va obj2ni kalit sifatida ishlatganda, ikkalasi ham .toString() orqali "[object Object]" stringiga aylanadi — bu bitta xuddi shu kalit, shuning uchun ikkinchisi birinchisini "bosib o'tadi" va faqat 1 ta kalit qoladi. Map esa haqiqiy object'larni alohida, noyob kalitlar sifatida saqlaydi, shuning uchun size — 2.
Quyidagi kodda muammo bor:
script.jsJavaScriptlet uniqueNames = new Set();uniqueNames.add("Ali");uniqueNames.add("Vali");console.log(uniqueNames.length); // dasturchi 2 kutgan, lekin undefined chiqadi
Your Task:
.length undefined ekanini tushuntiring.Yechim:
</details>script.jsJavaScriptlet uniqueNames = new Set();uniqueNames.add("Ali");uniqueNames.add("Vali");console.log(uniqueNames.size); // 2
Symbol — har doim noyob bo'lgan primitive type, object'larga "yashirin" property qo'shish uchun ishlatiladi.Map — istalgan turdagi (shu jumladan object) kalitlarga ega, tartibni saqlaydigan kalit-qiymat tuzilmasi.Set — faqat noyob qiymatlarni saqlovchi to'plam, takrorlanishlarni avtomatik olib tashlaydi.Map/Set — .size ishlatadi, Array/String esa .length ishlatadi.[...new Set(array)])..size, hech qachon .length ishlatmang.for...of — Map va Set bilan to'g'ridan-to'g'ri, qulay ishlaydi.script.jsJavaScript// Symbollet sym = Symbol("description");// Maplet map = new Map();map.set("key", "value");map.get("key");map.has("key");map.delete("key");map.size;// Setlet set = new Set([1, 2, 2, 3]);set.add(4);set.has(2);[...set]; // array'ga aylantirish
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: