{
  "assessmentTests": {
    "javascript_test": {
      "name": "JavaScript Testi",
      "desc": "Asosiy sintaksis va turdagi o'zgartirishlar, funksiyalar/o'rab olish/yopilishlar va bu, ob'ektlar/massivlar va ma'lumotlar strukturasi, hamda tadbir tsikli/asinxron/prototip idiomalarining 30 stsenariy savoli — sizning JavaScript bilimingiz ish beruvchi JavaScript kompetentsiligini qanday anglaydigan ekanligini bilib oling.",
      "recommendation": "Sizning JavaScript ko'nikmalari profili",
      "results": {
        "beginner": {
          "name": "Boshlang'ich",
          "desc": "Siz ishlayotgan funksiyalar va ob'ektlar yoza olasiz, lekin siz o'tkazib yuborgan savollar turdagi o'zgartirishlar va havola semantikasi atrofida guruhlashtirilgan, sintaksis emas — == solishdan oldin o'chiriqlab turlari o'zgartiradi, bir ob'ektni bo'lingan massiv tayinoti nusxalash o'rniga, nima uchun NaN hech qachon o'ziga teng emas. Bu JavaScript'da yomon bo'lishlik emas; bu dil o'zini tanlagan kod yozish yo'li bilan o'rganuvchi odamlarni, qiymatlar va havolalar aslida qanday ishlashini o'rganish o'rniga chalkash qiluvchi alohida qoidalardir. Ular ishda muhim, chunki ularning har biri hato olmay ishlayotgan va shunga qaramay noto'g'ri ishlayotgan kodning joyi.",
          "recommendation": "Ushbu tartibda uchta narsadan boshlang: nima uchun == solishdan oldin turlari o'zgartiriladi while === transformasiyasi qilmaydi; nima uchun massivni yoki ob'ektni yangi o'zgaruvchiga tayinlash qiymatni nusxalash o'rniga havolani nusxaladi; va var qanday ko'tariladi va undefined'ga ishga tushiriladi while let va const ularning deklaratsiyasi ishga tushugilmaguncha vaqt o'lim zonasida qoladi. MDN JavaScript qo'llanmasi hammasini ishlab chiqish misollari bilan qamrab oladi."
        },
        "intermediate": {
          "name": "O'rta",
          "desc": "Siz kundalik dastur kodini qulay bilan hal qilasiz — funksiyalar, massiv usullari, to'g'ri yo'nalish boshqaruvi — va rutin ish yoki kichik xususiyat bilan sekinlashtirilmaysiz. Bu yerdan Ilg'or o'rtasidagi bo'shliq, asosan JavaScript o'rab olish va vaqt qoidalari o'zaro ta'sir qilganda nima bo'ladi: tsikl geri chaqiruvlarining ichida ushlangan var, bir xil so'nggi qiymatni ko'paytirasiz kutubiy o'rniga; bu ob'ektning boshi turib, bir usul bundan uzoqlashtirilsa buning bilan ko'rsatib turishni to'xtatadi; kengaytirilgan nusxa chuqur ko'rinadi, lekin bir darajani nusxalaydi. Bular tez o'qish orqali o'tuvchi va faqat ma'lum vaqt ishlash sharti ostida paydo bo'ladigan xatolar turi.",
          "recommendation": "O'rab olish va bu aslida qanday talab qilinish vaqtida hal qilinishiga e'tibor bering ta'rif vaqti o'rniga: nima uchun var asosli tsikl har bir geri chaqiruv bir xil so'nggi hisoblagich qiymatini beradi while let beradi; bu qanday ma'qul vaqtda chaqirish funktsiyasi talab qiladi yozilgan joyining o'rniga; va nima uchun kengaytirilgan yoki Object.assign ob'ektning faqat yuqori darajasini nusxalash. Keyin tadbir tsikli, chunki bu allaqachon shaxsiy ravishda va'dasini biladigan odamlarni chalkash qiladi."
        },
        "advanced": {
          "name": "Ilg'or",
          "desc": "Bu ko'plab ish ofertalarining \"kuchli JavaScript\" degan ma'nosi keladigan darajasi. Siz filter/map/reduce zanjirini o'qiyapsiz va asl massivni o'zgartirishsiz aniq nima qaytishini bashorat qila olasiz, siz sinkron console.log nima uchun hamisha mikrotaskni yengani hamma vaqt setTimeout yengani sababini bilasiz, va Promise.all'ga tushunasiz, har qanday vada rad etsa rad etishini bilgan holda qolganini kutmasdan. Bu bandni yuqordan ajratuvchi vaqt prototip va ob'ekt modeli ishlashining tomonidir: prototip zanjir hasOwnProperty'ga qarshi meros usulini qanday hal qiladi va shaxsiy sinf maydonida haqiqatan nima o'chiriladi.",
          "recommendation": "Boshqa kod ham tegadigan holatni himoyalaydigan qismlarga sho'ng'ining: JavaScript prototip zanjirlari usullangan ob'ekt hohlashini o'z holi berishi ayniyatini qanday hal qiladi; sinf # maydonlarida tashqi kirish belgisidan haqiqatan nima o'chiriladi; va JSON.stringify undefined va funksiyalari oddiy ob'ekt ichida to'plamdakiga turli tarzda qanday talqin qiladi. MDN tadbir tsikli va prototip zanjiri haqidagi material ikkalasining uchun tabiy keyingi to'xta."
        },
        "expert": {
          "name": "Mutaxassis",
          "desc": "Siz barcha bo'limda eng yuqori ballni oldingiz — asosiy sintaksis, turlar va o'zgartirishlar; funksiyalar, o'rab olish, yopilishlar va bu; ob'ektlar, massivlar va ma'lumotlar strukturasi; va asinxron, tadbir tsikli, prototipl va idiomalar. Amaliy jihatdan, bu sizga begona funktsiyasini olish va sintaksis aytish kerakning emas, nima uchun qaytaradigan nima qaytaradigan ekanligini tushuntira olishingiz mumkinligini anglatadi; bu qiyinroq va qimmatli qobiliyatdir. Ushbu darajada til o'zi kamdan-kam shart; chegaraviy asosan asinxron nazorat oqimi yoki uning ostidagi ma'lumotlar shaklidir.",
          "recommendation": "Qaytargani endi dizayn va diagnostikada: Promise.all va Promise.race o'rtasida poyga sharti haqida ularning ta'riflarini qayta aytish o'rniga; yopilish raqamli holat uchun to'g'ri asbob qachon bo'lganida sechi; va ishlab chiqarish jurnalidagi mikrotask-vs-makrotask buyurtma xatosini viktorina o'rniga o'qiy oladigini. Agar rol uchun tanlangan bo'lsangiz, topgan vaqt hatosini tavsiflang — eski yopilish o'zgaruvchisini yoki noto'g'ri joyda asinxron geri chaqiruv — JavaScript xususiyatlarini nomlash o'rniga; bu mantiq ko'rsatadi, faqat lug'at emas."
        }
      },
      "questions": [
        {"question": "console.log(x);\nvar x = 5;\nBu nima chop etadi?", "options": [{"icon": "", "label": "5 — var deklaratsiyalari darhol, boshqa kod oldin ishga tushiriladi"}, {"icon": "", "label": "ReferenceError: x aniqlanmadi"}, {"icon": "", "label": "undefined — var deklaratsiyalari ularning o'rab olishning tepasiga ko'tariladi va undefined'ga ishga tushiriladi, lekin tayinlash joyida ishga tushiriladi, shuning uchun ishga tushasidan oldin o'zgaruvchi mavjud, lekin undefined ni o'z ichiga oladi"}, {"icon": "", "label": "null"}]},
        {"question": "console.log(y);\nlet y = 5;\nNima bo'ladi?", "options": [{"icon": "", "label": "ReferenceError: Initsializatsiyadan oldin 'y' ga kira olmaydi — let o'rab olishning tepasiga ko'tariladi, lekin deklaratsiya satri haqiqatan ishga tushmagunicha vaqt o'lim zonasida qoladi"}, {"icon": "", "label": "Bu undefined chop etadi, var bo'lgani kabi"}, {"icon": "", "label": "Bu 5 chop etadi"}, {"icon": "", "label": "Parse vaqtida SyntaxError chiqaradi"}]},
        {"question": "const arr = [1, 2, 3];\narr.push(4);\nconsole.log(arr.length);\nBu nima chop etadi?", "options": [{"icon": "", "label": "4 — const faqat arr bog'lanishini qayta tayinlashni oldini oladi, unda ko'rsatadigan massiv ob'ektini emas, shuning uchun push hali ham ishlaydi"}, {"icon": "", "label": "TypeError chiqaradi, chunki arr const"}, {"icon": "", "label": "3 — push const massivda bloklangan"}, {"icon": "", "label": "undefined"}]},
        {"question": "console.log('' == 0);\nconsole.log('' === 0);\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "true keyin true"}, {"icon": "", "label": "false keyin false"}, {"icon": "", "label": "true keyin false — == bo'sh satrni solishdan oldin 0'ga o'zgartiradi, === esa turni va qiymatni o'zgartirmay soladi, va satr hech qachon raqamga qat'iy teng emas"}, {"icon": "", "label": "false keyin true"}]},
        {"question": "console.log(NaN === NaN);\nconsole.log(Number.isNaN(NaN));\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "true keyin true"}, {"icon": "", "label": "true keyin false"}, {"icon": "", "label": "false keyin false"}, {"icon": "", "label": "false keyin true — NaN JavaScript'da o'ziga qat'iy teng bo'lmagan yagona qiymat, lekin Number.isNaN() baribir to'g'ri aniqlab oladi"}]},
        {"question": "console.log(typeof null);\nBu nima chop etadi?", "options": [{"icon": "", "label": "\"null\""}, {"icon": "", "label": "\"object\" — til'da uzoq vaqtdan beri xato: typeof null \"object\" qaytaradi, garchi null primitiv bo'lsa ham, va u o'sha vaqtdan buyon ortaga compatible bo'lish uchun saqlanib qolgan"}, {"icon": "", "label": "\"undefined\""}, {"icon": "", "label": "\"boolean\""}]},
        {"question": "Quyidagilardan qaysi biri if shartida haqiqiy?", "options": [{"icon": "", "label": "0"}, {"icon": "", "label": "\"\" (bo'sh satr)"}, {"icon": "", "label": "null"}, {"icon": "", "label": "\"0\" — bo'sh bo'lmagan satr har doim JavaScript'da haqiqiydir, hattoki uning tarkibi o'zi \"0\" satri bo'lsa ham"}]},
        {"question": "foo();\nfunction foo() { console.log('a'); }\nbar();\nvar bar = function() { console.log('b'); };\nNima bo'ladi?", "options": [{"icon": "", "label": "Ikkala chaqiruv ham chop etiladi, \"a\" keyin \"b\""}, {"icon": "", "label": "foo() \"a\" ni chop etadi; bar() TypeError bilan taqiladi: bar funktsiya emas — funktsiya deklaratsiyalari ularning tanasi bilan to'liq ko'tariladi, lekin var tayinlangan funktsiya ifodasi faqat var'ni (undefined sifatida) ko'taradi, tayinlashni emas"}, {"icon": "", "label": "Ikkala chaqiruv ham ReferenceError bilan taqiladi"}, {"icon": "", "label": "foo() taqiladi; bar() \"b\" ni chop etadi"}]},
        {"question": "function makeCounter() {\n  let count = 0;\n  return function() { count++; return count; };\n}\nconst counter = makeCounter();\nconsole.log(counter());\nconsole.log(counter());\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "1 keyin 1"}, {"icon": "", "label": "0 keyin 1"}, {"icon": "", "label": "undefined keyin undefined"}, {"icon": "", "label": "1 keyin 2 — qaytargan funktsiya makeCounter'ning o'rab olishining bir xil count o'zgaruvchisini yopadi, va bu o'zgaruvchi chaqiruvlar orasida qoladi, qayta tiklana olmaydi"}]},
        {"question": "for (var i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nBu nima chop etadi?", "options": [{"icon": "", "label": "0, 1, 2"}, {"icon": "", "label": "3, 3, 3 — var funktsiya o'rab olishiga ega, bloklash emas, shuning uchun uchta geri chaqiruv bir xil i'ni yopadi, tsikl tugaganda va ularning aslida ishga tushganda 3 ga teng"}, {"icon": "", "label": "0, 0, 0"}, {"icon": "", "label": "undefined, undefined, undefined"}]},
        {"question": "for (let i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nBu nima chop etadi?", "options": [{"icon": "", "label": "3, 3, 3"}, {"icon": "", "label": "0, 0, 0"}, {"icon": "", "label": "undefined, undefined, undefined"}, {"icon": "", "label": "0, 1, 2 — let tsikl takrorlanishining har birida i'ning yangi bog'lanishini yaratadi, shuning uchun har bir geri chaqiruv bir xil o'zgaruvchini emas, o'zining alohida nusxasini yopadi"}]},
        {"question": "function greet() { return `Hi, ${this.name}`; }\nconst person = { name: 'Ana' };\nconsole.log(greet.call(person));\nBu nima chop etadi?", "options": [{"icon": "", "label": "\"Hi, Ana\" — Function.prototype.call funktsiyani chaqiradi, bu'ni uning birinchi argumentiga aniq o'rnatib, shuning uchun this.name person'ga qarshi hal qilinadi"}, {"icon": "", "label": "\"Hi, undefined\" — call() faqat ob'ektning metodlari bo'lgan funktsiyalarda ishlaydi"}, {"icon": "", "label": "TypeError bilan taqiladi, chunki greet person'ning metodsi emas"}, {"icon": "", "label": "\"Hi, ${this.name}\" — call() shablonni tahlil qilmaydi"}]},
        {"question": "const timer = {\n  seconds: 0,\n  start: function() {\n    setInterval(() => { this.seconds++; }, 1000);\n  },\n};\nNima uchun odamlar function() { this.seconds++ } yerine strelka funktsiyasini afzal ko'rasid setInterval ichida?", "options": [{"icon": "", "label": "Strelka funktsiyalarining o'zi bu'si yo'q — ular o'z start funktsiyasidan leksik this'ni qopladilar, bu timer'dir (start timer.start() sifatida chaqirilgani uchun), shuning uchun this.seconds har bir taktada timer.seconds'ni to'g'ri ko'rsatadi"}, {"icon": "", "label": "Strelka funktsiyalar ishga tushirilganda oddiy funksiyalardan tezroq ishlaydi"}, {"icon": "", "label": "Strelka funktsiyalar avtomatik ravishda bu'ni global ob'ektga bog'laydilar, bu timer'ga teng bo'ladi"}, {"icon": "", "label": "Strelka funktsiyalar avtomatik ravishda bu'ni global o'zgaruvchiga o'zgartiradilar"}]},
        {"question": "function multiply(a, b) { return a * b; }\nconst double = multiply.bind(null, 2);\nconsole.log(double(5));\nBu nima chop etadi?", "options": [{"icon": "", "label": "Xato bilan taqiladi, chunki bind ikkala argumentni oldindan talab qiladi"}, {"icon": "", "label": "10 — bind bu'ni va istalgan oldingi argumentlarni oldindan o'rnatib yangi funktsiya qaytaradi; double(5) chaqirishi qolgan b=5 argumentini taqdim etadi, shuning uchun multiply(2, 5) ishlaydi"}, {"icon": "", "label": "NaN"}, {"icon": "", "label": "7, chunki bind o'z argumentlarini chaqiruv o'rniga qo'shadi"}]},
        {"question": "function outer() {\n  let x = 10;\n  function inner() {\n    let x = 20;\n    console.log(x);\n  }\n  inner();\n  console.log(x);\n}\nouter();\nIki console.log chaqiruvi nima chop etadi?", "options": [{"icon": "", "label": "20 keyin 20"}, {"icon": "", "label": "20 keyin 10 — inner'ning o'z let x, outer'ning x'ini faqat inner'ning o'rab olishi ichida soya qiladi; outer'ning o'z x hech qachon teginadi"}, {"icon": "", "label": "10 keyin 10"}, {"icon": "", "label": "ReferenceError bilan taqiladi, chunki x ikki marta deklaratsiyalandi"}]},
        {"question": "const a = [1, 2, 3];\nconst b = a;\nb.push(4);\nconsole.log(a.length);\nBu nima chop etadi?", "options": [{"icon": "", "label": "3 — b a'ning alohida nusxasi"}, {"icon": "", "label": "undefined"}, {"icon": "", "label": "TypeError bilan taqiladi, chunki a const"}, {"icon": "", "label": "4 — massivlar ob'ektdir, shuning uchun const b = a havolani ko'chirmaydi, massivni; b orqali push qilish a ko'rsatadigan aniq massivni o'zgartiradi"}]},
        {"question": "const original = { name: 'Ana', tags: ['x', 'y'] };\nconst copy = { ...original };\ncopy.name = 'Bea';\ncopy.tags.push('z');\nconsole.log(original.name, original.tags.length);\nBu nima chop etadi?", "options": [{"icon": "", "label": "'Ana' 2 — spread har bir o'rnatilgan ob'ektni va massivni chuqur nusxalaydi"}, {"icon": "", "label": "'Ana' 3 — spread faqat superfitsial ko'chirma: name kabi primitiv xususiyat qiymat bo'yicha ko'chiriladi, shuning uchun copy.name qayta tayinlash hech qachon original'ga teginmaydi, lekin tags kabi o'rnatilgan massiv havola bo'yicha ko'chiriladi, shuning uchun copy.tags'ga push qilish original.tags ko'rsatadigan aniq massivni o'zgartiradi"}, {"icon": "", "label": "'Bea' 3 — spread hamma narsani havola bo'yicha ko'chirmaydi, shuning uchun ham tepada ham o'rnatilgan o'zgarishlar original'ga qaytaradi"}, {"icon": "", "label": "'Bea' 2"}]},
        {"question": "const { a: x = 10, b: y = 20 } = { a: 5 };\nconsole.log(x, y);\nBu nima chop etadi?", "options": [{"icon": "", "label": "undefined undefined"}, {"icon": "", "label": "5 undefined"}, {"icon": "", "label": "10 20"}, {"icon": "", "label": "5 20 — a x'ga qayta nomlandi va mavjud, shuning uchun u 5 qiymatini saqlab qoladi; b y'ga qayta nomlandi va yo'q, shuning uchun u 20 default qiymatiga qaytaradi"}]},
        {"question": "const [first, ...rest] = [1, 2, 3, 4];\nconsole.log(rest);\nBu nima chop etadi?", "options": [{"icon": "", "label": "[1, 2, 3, 4]"}, {"icon": "", "label": "[2, 3, 4] — rest birinchidan keyin har bir qolgan elementni yangi massivga yig'adi"}, {"icon": "", "label": "2"}, {"icon": "", "label": "[1]"}]},
        {"question": "const nums = [10, 1, 2];\nnums.sort();\nconsole.log(nums);\nBu nima chop etadi?", "options": [{"icon": "", "label": "[1, 2, 10] — sort har doim raqamlarni sukutiy holda o'sish tartibida raqamli ravishda tartiblaydi"}, {"icon": "", "label": "[10, 1, 2] — sort asl massivni o'zgartirmaydi"}, {"icon": "", "label": "[1, 10, 2] — Array.prototype.sort'ning standart taqqoslaguchiları elementlarni satrga o'zgartiradi va leksikografik ravishda soladi, shuning uchun \"10\" \"2\"dan oldin tartiblaydi; sort massivni joyida o'zgartiradi, yangi massiv qaytarmaydi"}, {"icon": "", "label": "[2, 1, 10]"}]},
        {"question": "const user = { profile: { age: 0 } };\nconsole.log(user.profile?.age ?? 'unknown');\nconsole.log(user.address?.city ?? 'unknown');\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "'unknown' keyin 'unknown' — ?? || kabi 0'ni yo'qni deb hisoblab oladi"}, {"icon": "", "label": "0 keyin 'unknown' — ?? faqat null yoki undefined'da qaytaradi, 0 kabi boshqa yolg'on qiymatlarida emas, shuning uchun age (0) qoladi; user.address undefined, shuning uchun ?. butun zanjirni undefined'da qisqartiradi va ?? keyin 'unknown' taqdim etadi"}, {"icon": "", "label": "0 keyin undefined"}, {"icon": "", "label": "'unknown' keyin 0"}]},
        {"question": "const obj = { a: undefined, b: function(){}, c: NaN, d: [undefined, function(){}, 1] };\nconsole.log(JSON.stringify(obj));\nBu nima chop etadi?", "options": [{"icon": "", "label": "'{\"a\":null,\"b\":null,\"c\":null,\"d\":[null,null,1]}' — har bir qo'llab-quvvatlanmagan qiymat hamma yerda null bo'ladi, ob'ektlarda va massivlarda bir xil"}, {"icon": "", "label": "'{\"a\":undefined,\"b\":undefined,\"c\":NaN,\"d\":[undefined,null,1]}'"}, {"icon": "", "label": "'{\"c\":null,\"d\":[null,null,1]}' — undefined yoki funktsiya bo'lgan xususiyatlar butunlay o'tkazib yuboriladi, va NaN null'ga serializatsiyalashtiradi, lekin massiv ichida bu xil qo'llab-quvvatlanmagan qiymatlar null bo'ladi, chunki massiv elementini o'chirish har bir keyingi indeksni siljitadi"}, {"icon": "", "label": "TypeError bilan taqiladi, chunki NaN JSON'ga serializatsiyalash mumkin emas"}]},
        {"question": "console.log('1');\nsetTimeout(() => console.log('2'), 0);\nPromise.resolve().then(() => console.log('3'));\nconsole.log('4');\nBu qanday tartibda chop etiladi?", "options": [{"icon": "", "label": "1, 2, 3, 4"}, {"icon": "", "label": "1, 4, 2, 3"}, {"icon": "", "label": "1, 4, 3, 2 — sinxron kod birinchi ishlaydi (shuning uchun 1 va 4 darhol chop etiladi), keyin mikrotask navbati tadbir tsikli keyingi makrotaskga o'tishidan oldin butunlay bo'shatiladi, shuning uchun 3 setTimeout geri chaqiruvining 2'sidan oldin chop etiladi"}, {"icon": "", "label": "1, 3, 4, 2"}]},
        {"question": "async function foo() {\n  console.log('a');\n  await null;\n  console.log('b');\n}\nconsole.log('start');\nfoo();\nconsole.log('end');\nBu qanday tartibda chop etiladi?", "options": [{"icon": "", "label": "start, a, end, b — foo() uning birinchi await gacha sinxron ishlaydi, shuning uchun 'a' foo() chaqirilganda darhol loglanadi; await keyin foo'ni to'xtatadi va chaqiruv ko'rsatkichiga boshqaruv qaytaradi, shuning uchun 'end' qayta boshlangan 'b' oldin loglanadi, bu keyinroq mikrotask sifatida ishlaydi"}, {"icon": "", "label": "start, a, b, end"}, {"icon": "", "label": "start, end, a, b"}, {"icon": "", "label": "a, start, end, b"}]},
        {"question": "Promise.all([\n  Promise.resolve(1),\n  Promise.reject('err'),\n  Promise.resolve(3),\n]).then(r => console.log('ok', r)).catch(e => console.log('fail', e));\nBu nima chop etadi?", "options": [{"icon": "", "label": "'fail err' — Promise.all bir vada rad etilganda darhol rad etiladi, boshqalarning natijalari e'tiborga olinmaydi, shuning uchun catch handler rad etilish sababida ishlaydi"}, {"icon": "", "label": "'ok' [1, 3]"}, {"icon": "", "label": "'ok' [1, undefined, 3]"}, {"icon": "", "label": "Sinxron ravishda taqiladi va hech qanday handler ishlama"}]},
        {"question": "const fast = new Promise(res => setTimeout(() => res('fast'), 10));\nconst slow = new Promise(res => setTimeout(() => res('slow'), 100));\nPromise.race([fast, slow]).then(v => console.log(v));\nBu nima chop etadi?", "options": [{"icon": "", "label": "'slow'"}, {"icon": "", "label": "['fast', 'slow']"}, {"icon": "", "label": "'fast' — Promise.race uning vada'laridan birinchisi hal qilinganda hal qilinadi, va 10ms taymerlari 100ms taymerlari oldin hal qilinadi"}, {"icon": "", "label": "Xato bilan taqiladi, chunki race aynan ikkita vada'ni talab qiladi"}]},
        {"question": "function Animal(name) { this.name = name; }\nAnimal.prototype.speak = function() { return `${this.name} makes a sound`; };\nconst dog = new Animal('Rex');\nconsole.log(dog.speak());\nconsole.log(dog.hasOwnProperty('speak'));\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "'Rex makes a sound' keyin true"}, {"icon": "", "label": "undefined keyin false"}, {"icon": "", "label": "TypeError bilan taqiladi, chunki dog'ning o'z speak'si yo'q"}, {"icon": "", "label": "'Rex makes a sound' keyin false — speak Animal.prototype'da aniqlandi, dog egzemplyrida emas; dog uni chaqirilganda prototip zanjir orqali topadi, lekin hasOwnProperty faqat egzemplyr xususiyatlarini tekshiradi, hech qanday voris qilmadilar"}]},
        {"question": "class Counter {\n  #count = 0;\n  increment() { this.#count++; return this.#count; }\n}\nconst c = new Counter();\nconsole.log(c.increment());\nconsole.log(c.count);\nIki qator nima chop etadi?", "options": [{"icon": "", "label": "1 keyin undefined — #count sinf xususiyati, faqat sinf metodlaridan ichida oqilmoq va yozilmoq; c.count (#siz) butunlay boshqa, oddiy xususiyat, u hech qachon o'rnatilmadi, shuning uchun undefined"}, {"icon": "", "label": "1 keyin 0"}, {"icon": "", "label": "1 keyin 1"}, {"icon": "", "label": "c.count'ga kirilganda SyntaxError bilan taqiladi"}]},
        {"question": "const items = ['a', 'b'];\nconst label = `Items: ${items.length > 0 ? items.join(', ') : 'none'}`;\nconsole.log(label);\nBu nima chop etadi?", "options": [{"icon": "", "label": "'Items: ${items.length > 0 ? items.join(\\', \\') : \\'none\\'}'"}, {"icon": "", "label": "'Items: none'"}, {"icon": "", "label": "'Items: a, b' — shablon shom'alar ${}... ichiga joylashtirilgan har qanday ifodani hisoblaydilar, to'liq ternaryni o'z ichiga oladigan, va natijasini to'g'ridan-to'g'ri satrga interpolyatsiyalaydi"}, {"icon": "", "label": "SyntaxError bilan taqiladi, chunki ternary'lar shablon shom'alari ichida ruxsat etilmaydi"}]},
        {"question": "const nums = [1, 2, 3, 4, 5];\nconst result = nums.filter(n => n % 2 === 0).map(n => n * 10).reduce((sum, n) => sum + n, 0);\nconsole.log(result, nums);\nBu nima chop etadi?", "options": [{"icon": "", "label": "60 [1, 2, 3, 4, 5] — filter, map va reduce har biri asl massivni o'zgartirasdan yangi massiv yoki qiymat qaytaradi, shuning uchun nums o'zgartirilmaydi, lekin result oxirgi qisqartirilgan jami (2 va 4, 20 va 40'ga ikki barobar, 60'ga yig'indi)"}, {"icon": "", "label": "60 [2, 4, 20, 40]"}, {"icon": "", "label": "150 [1, 2, 3, 4, 5]"}, {"icon": "", "label": "60 [20, 40]"}]}
      ],
      "optionOrderVersion": "50fc0eba818f2d72"
    }
  }
}
