{
  "assessmentTests": {
    "javascript_test": {
      "name": "د جاوا سکریپټ ازموینه",
      "desc": "د اصلي نحو او جبر، دندو/سکاپ/کلوزرونو او this، آبجیکټونو/اریونو او ډیټا جوړښتونو، او د پیښې لوپ/اسینک/پروټوټایپ محاورو په اړه 30 سناریو پوښتنې — ومومئ چې ایا ستاسو جاوا سکریپټ د هغه څه سره سمون لري چې د دندې پوسټ د جاوا سکریپټ مهارت له مخې معنی لري.",
      "recommendation": "ستاسو د جاوا سکریپټ مهارتونو پروفایل",
      "results": {
        "beginner": {
          "name": "پیل کونکی",
          "desc": "تاسو کولی شئ کاري فنکشنونه او آبجیکټونه ولیکئ، مګر هغه پوښتنې چې تاسو ځواب نه کړې د سینټکس پر ځای د ټایپ کویرشن او ریفرنس سیمانټیکس په اړه وې — == په خاموشۍ سره د پرتله کولو دمخه ډولونه بدلوي، د ارې اساینمنټ چې د کاپي کولو پرځای یو آبجیکټ شریکوي، ولې NaN هیڅکله له ځان سره مساوي نه وي. دا هیڅ یو په جاوا سکریپټ کې د کمزورتیا په اړه ندي؛ دا هغه ځانګړي قواعد دي چې هغه خلک ګمراه کوي چې ژبه یې د داسې کوډ په لیکلو زده کړې چې کار یې کړی، د دې پرځای چې زده کړي چې ارزښتونه او ریفرنسونه څنګه په حقیقت کې کار کوي. دا په کار کې مهم دي ځکه چې هر یو هغه ځای دی چې کوډ له خطا پرته چلیږي او بیا هم غلط کار کوي.",
          "recommendation": "په دې ترتیب سره له دریو شیانو پیل وکړئ: ولې == د پرتله کولو دمخه ډولونه بدلوي پداسې حال کې چې === نه کوي، ولې یوې نوې متغیر ته د یوې ارې یا آبجیکټ سپارل د ارزښت پرځای ریفرنس کاپي کوي، او څنګه var هوسټ کیږي او undefined ته انیشلایز کیږي پداسې حال کې چې let او const د دوی د ډیکلریشن تر چلېدو پورې په ټیمپورل ډیډ زون کې پاتې کیږي. د MDN جاوا سکریپټ لارښود دا درې واړه د چلېدونکو مثالونو سره پوښي."
        },
        "intermediate": {
          "name": "منځنۍ کچه",
          "desc": "تاسو د ورځني اپلیکیشن کوډ په اسانۍ سره سمبالوئ — فنکشنونه، د ارې میتودونه، ساده کنټرول فلو — او د معمول فیچر کار به مو ورو نه کړي. د دې او پرمختللي کچې ترمنځ واټن اکثرا په دې کې دی چې څه پیښیږي کله چې د جاوا سکریپټ سکوپینګ او ټایمینګ قواعد تعامل کوي: یو var چې د لوپ په کال بیکونو کې نیول شوی ټول ورته وروستی ارزښت لولي، یو this چې په خاموشۍ سره آبجیکټ ته اشاره کول ودروي کله چې یو میتود ترې جلا شي، یو سپریډ کاپي چې ژوره ښکاري مګر یوازې یوه کچه کاپي کوي. دا هغه ډول بګونه دي چې په یوه چټکه کتنه کې له نظره تیریږي او یوازې د یو ځانګړي رنټایم حالت لاندې څرګندیږي.",
          "recommendation": "په دې تمرکز وکړئ چې سکوپ او this څنګه په حقیقت کې د تعریف وخت پرځای د کال په وخت کې حل کیږي: ولې د var پر بنسټ for لوپ هر کال بیک ته ورته وروستی کاونټر ارزښت ورکوي پداسې حال کې چې let نه کوي، څنګه this د دې له مخې ټاکل کیږي چې فنکشن څنګه کال کیږي نه دا چې چیرته لیکل شوی، او ولې یو سپریډ یا Object.assign یوازې د یو آبجیکټ پورتنۍ کچه کاپي کوي. بیا د ایونټ لوپ، ځکه چې دا هغه څه دي چې هغه خلک ګمراه کوي چې دمخه په انفرادي ډول پرامیسز پیژني."
        },
        "advanced": {
          "name": "پرمختللې کچه",
          "desc": "دا هغه کچه ده چې د کار ډیری اعلانونه یې د «قوي جاوا سکریپټ» په توګه یادوي. تاسو د filter/map/reduce یو ځنځیر لولئ او کولی شئ په دقیقه توګه وړاندوینه وکړئ چې دا به څه بیرته راوګرځوي پرته له دې چې اصلي ارې بدله کړي، تاسو پوهیږئ چې ولې یو سنکرونس console.log تل یو مایکروټاسک ماتوي کوم چې تل یو setTimeout ماتوي، او تاسو Promise.all ته لاسرسی لرئ پدې پوهیدو سره چې دا سمدلاسه رد کیږي کله چې یو پرامیس رد شي د دې پرځای چې نورو ته انتظار وکړي. هغه څه چې دا ډله له لوړې کچې څخه جلا کوي د کار پروټوټایپ او آبجیکټ-ماډل اړخ دی: څنګه د پروټوټایپ ځنځیر یو میراثي میتود د hasOwnProperty په مقابل کې حل کوي، او یو شخصي کلاس فیلډ په حقیقت کې څه پټوي.",
          "recommendation": "هغو برخو ته ځان ورسوئ چې د نورو کوډونو لخوا هم لمس شوي حالت ساتي: څنګه د جاوا سکریپټ پروټوټایپ ځنځیر د میتود لټونونه حل کوي چې پخپله په انسټنس کې ندي، د کلاس شخصي #فیلډونه په حقیقت کې له بهرني لاسرسي څخه څه پټوي، او څنګه JSON.stringify په یوه ساده آبجیکټ کې د یوې ارې په پرتله undefined او فنکشنونو سره مختلف چلند کوي. د ایونټ لوپ او پروټوټایپ ځنځیر په اړه د MDN مواد د دواړو لپاره طبیعي بل تمځای دی."
        },
        "expert": {
          "name": "متخصص",
          "desc": "تاسو په هره برخه کې ترټولو لوړې نمرې ترلاسه کړې — اصلي سینټکس، ډولونه او کویرشن؛ فنکشنونه، سکوپ، کلوزرونه او this؛ آبجیکټونه، ارې او د ډیټا جوړښتونه؛ او اسینک، ایونټ لوپ، پروټوټایپونه او ایډیمونه. په عملي توګه، دا پدې مانا ده چې تاسو ته د یو پردي کس فنکشن درکول کیدی شي او تاسو تشریح کولی شئ چې ولې دا هغه څه بیرته راګرځوي چې بیرته راګرځوي، نه یوازې دا چې سینټکس وايي څه باید وکړي، کوم چې یو سخت او ډیر ارزښتناک مهارت دی. په دې کچه ژبه پخپله په ندرت سره محدودونکی فکتور وي؛ محدودیت معمولا د اسینک کنټرول فلو یا د هغې لاندې د ډیټا بڼه وي.",
          "recommendation": "اوس بیرته راستنیدنه په ډیزاین او تشخیص کې ده: د Promise.all او Promise.race ترمنځ د ریس کنډیشن په اړه استدلال کول د دوی د تعریفونو تکرارولو پرځای، دا غوره کول چې کله یو کلوزر د شخصي حالت لپاره سمه وسیله ده د دې په پرتله چې کله د کلاس شخصي فیلډ وي، او په پروډکشن لاګونو کې د مایکروټاسک-په-مقابل-کې-میکروټاسک ترتیب کولو بګ لوستل د دې پرځای چې په یوه کویز کې وي. که تاسو د یوې دندې لپاره ارزول کیږئ، یو ټایمینګ بګ تشریح کړئ چې تاسو موندلی وي — یو زوړ کلوزر متغیر یا یو له ترتیب څخه بهر اسینک کال بیک — د جاوا سکریپټ فیچرونو نومولو پرځای؛ دا د استدلال ښودنه کوي، نه یوازې لغتونه."
        }
      },
      "questions": [
        {
          "question": "console.log(x);\nvar x = 5;\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "5"
            },
            {
              "icon": "",
              "label": "ReferenceError: x تعریف شوی نه دی"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "null"
            }
          ]
        },
        {
          "question": "console.log(y);\nlet y = 5;\nڅه پېښیږي؟",
          "options": [
            {
              "icon": "",
              "label": "دا یو ReferenceError غورځوي"
            },
            {
              "icon": "",
              "label": "دا undefined چاپوي"
            },
            {
              "icon": "",
              "label": "دا 5 چاپوي"
            },
            {
              "icon": "",
              "label": "دا یو SyntaxError غورځوي"
            }
          ]
        },
        {
          "question": "const arr = [1, 2, 3];\narr.push(4);\nconsole.log(arr.length);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "4"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            }
          ]
        },
        {
          "question": "console.log('' == 0);\nconsole.log('' === 0);\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "true بیا true"
            },
            {
              "icon": "",
              "label": "ناسم بیا ناسم"
            },
            {
              "icon": "",
              "label": "true بیا false"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            }
          ]
        },
        {
          "question": "console.log(NaN === NaN);\nconsole.log(Number.isNaN(NaN));\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "true بیا true"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "ناسم بیا ناسم"
            },
            {
              "icon": "",
              "label": "false بیا true"
            }
          ]
        },
        {
          "question": "console.log(typeof null);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "\"null\""
            },
            {
              "icon": "",
              "label": "\"object\""
            },
            {
              "icon": "",
              "label": "\"undefined\""
            },
            {
              "icon": "",
              "label": "\"boolean\""
            }
          ]
        },
        {
          "question": "کله چې په if شرط کې وکارول شي، لاندې کوم یو truthy دی؟",
          "options": [
            {
              "icon": "",
              "label": "0"
            },
            {
              "icon": "",
              "label": "«» (یو تش سټرینګ)"
            },
            {
              "icon": "",
              "label": "null"
            },
            {
              "icon": "",
              "label": "«0» (د صفر سټرینګ)"
            }
          ]
        },
        {
          "question": "foo();\nfunction foo() { console.log('a'); }\nbar();\nvar bar = function() { console.log('b'); };\nڅه پېښیږي؟",
          "options": [
            {
              "icon": "",
              "label": "دواړه کالونه چاپوي: «a» او بیا «b»"
            },
            {
              "icon": "",
              "label": "foo() «a» چاپوي؛ bar() یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "foo() او bar() دواړه یو ReferenceError غورځوي"
            },
            {
              "icon": "",
              "label": "foo() یو ReferenceError غورځوي؛ bar() «b» چاپوي"
            }
          ]
        },
        {
          "question": "function makeCounter() {\n  let count = 0;\n  return function() { count++; return count; };\n}\nconst counter = makeCounter();\nconsole.log(counter());\nconsole.log(counter());\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "1 بیا 1"
            },
            {
              "icon": "",
              "label": "NaN بیا NaN"
            },
            {
              "icon": "",
              "label": "undefined بیا undefined"
            },
            {
              "icon": "",
              "label": "1 بیا 2"
            }
          ]
        },
        {
          "question": "for (var i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "0, 1, 2"
            },
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "دا یو ReferenceError غورځوي"
            },
            {
              "icon": "",
              "label": "undefined, undefined, undefined"
            }
          ]
        },
        {
          "question": "for (let i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "دا یو ReferenceError غورځوي"
            },
            {
              "icon": "",
              "label": "undefined, undefined, undefined"
            },
            {
              "icon": "",
              "label": "0, 1, 2"
            }
          ]
        },
        {
          "question": "function greet() { return `Hi, ${this.name}`; }\nconst person = { name: 'Ana' };\nconsole.log(greet.call(person));\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "«Hi, Ana»"
            },
            {
              "icon": "",
              "label": "«Hi, undefined»"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "«Hi, ${this.name}»"
            }
          ]
        },
        {
          "question": "const timer = {\n  seconds: 0,\n  start: function() {\n    setInterval(() => { this.seconds++; }, 1000);\n  },\n};\nخلک ولې دلته په setInterval کې د function() { this.seconds++ } پر ځای د ارو فنکشن ته ترجیح ورکوي؟",
          "options": [
            {
              "icon": "",
              "label": "ارو فنکشنونه د start د this څخه کار اخلي، کوم چې timer دی"
            },
            {
              "icon": "",
              "label": "د غشي دندې د عادي دندو په پرتله ګړندۍ چلیږي"
            },
            {
              "icon": "",
              "label": "د غشي دندې دا نړیوال څیز ته وتړي"
            },
            {
              "icon": "",
              "label": "د غشي دندې دا په نړیوال متغیر بدلوي"
            }
          ]
        },
        {
          "question": "function multiply(a, b) { return a * b; }\nconst double = multiply.bind(null, 2);\nconsole.log(double(5));\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "5"
            },
            {
              "icon": "",
              "label": "10"
            },
            {
              "icon": "",
              "label": "NaN"
            },
            {
              "icon": "",
              "label": "7"
            }
          ]
        },
        {
          "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();\nدوه console.log غږونه څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "20 بیا 20"
            },
            {
              "icon": "",
              "label": "20 بیا 10"
            },
            {
              "icon": "",
              "label": "10 بیا 10"
            },
            {
              "icon": "",
              "label": "دا یو SyntaxError غورځوي"
            }
          ]
        },
        {
          "question": "const a = [1, 2, 3];\nconst b = a;\nb.push(4);\nconsole.log(a.length);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "4"
            }
          ]
        },
        {
          "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);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'Ana' 2"
            },
            {
              "icon": "",
              "label": "'Ana' 3"
            },
            {
              "icon": "",
              "label": "'Bea' 3"
            },
            {
              "icon": "",
              "label": "'Bea' 2"
            }
          ]
        },
        {
          "question": "const { a: x = 10, b: y = 20 } = { a: 5 };\nconsole.log(x, y);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "undefined undefined"
            },
            {
              "icon": "",
              "label": "5 undefined"
            },
            {
              "icon": "",
              "label": "10 20"
            },
            {
              "icon": "",
              "label": "5 20"
            }
          ]
        },
        {
          "question": "const [first, ...rest] = [1, 2, 3, 4];\nconsole.log(rest);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 3, 4]"
            },
            {
              "icon": "",
              "label": "[2, 3, 4]"
            },
            {
              "icon": "",
              "label": "2"
            },
            {
              "icon": "",
              "label": "[1]"
            }
          ]
        },
        {
          "question": "const nums = [10, 1, 2];\nnums.sort();\nconsole.log(nums);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 10]"
            },
            {
              "icon": "",
              "label": "[10, 1, 2]"
            },
            {
              "icon": "",
              "label": "[1, 10, 2]"
            },
            {
              "icon": "",
              "label": "[2, 1, 10]"
            }
          ]
        },
        {
          "question": "const user = { profile: { age: 0 } };\nconsole.log(user.profile?.age ?? 'unknown');\nconsole.log(user.address?.city ?? 'unknown');\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'نامعلوم' بیا 'نامعلوم'"
            },
            {
              "icon": "",
              "label": "0 بیا 'نامعلوم'"
            },
            {
              "icon": "",
              "label": "0 بیا نامعلوم"
            },
            {
              "icon": "",
              "label": "'نامعلوم' بیا 0"
            }
          ]
        },
        {
          "question": "const obj = { a: undefined, b: function(){}, c: NaN, d: [undefined, function(){}, 1] };\nconsole.log(JSON.stringify(obj));\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'{\"a\":null,\"b\":null,\"c\":null,\"d\":[null,null,1]}'"
            },
            {
              "icon": "",
              "label": "'{\"c\":NaN,\"d\":[1]}'"
            },
            {
              "icon": "",
              "label": "'{\"c\":null,\"d\":[null,null,1]}'"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            }
          ]
        },
        {
          "question": "console.log('1');\nsetTimeout(() => console.log('2'), 0);\nPromise.resolve().then(() => console.log('3'));\nconsole.log('4');\nدا په کوم ترتیب چاپ کیږي؟",
          "options": [
            {
              "icon": "",
              "label": "1, 2, 3, 4"
            },
            {
              "icon": "",
              "label": "1, 4, 2, 3"
            },
            {
              "icon": "",
              "label": "1, 4, 3, 2"
            },
            {
              "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');\nدا په کوم ترتیب چاپ کیږي؟",
          "options": [
            {
              "icon": "",
              "label": "start, a, end, b"
            },
            {
              "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));\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'fail err'"
            },
            {
              "icon": "",
              "label": "'ok' [1, 3]"
            },
            {
              "icon": "",
              "label": "'ok' [1, undefined, 3]"
            },
            {
              "icon": "",
              "label": "دا خطا ورکوي، او هیڅ سمبالوونکی نه چلیږي"
            }
          ]
        },
        {
          "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));\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'slow'"
            },
            {
              "icon": "",
              "label": "['fast', 'slow']"
            },
            {
              "icon": "",
              "label": "'fast'"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            }
          ]
        },
        {
          "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'));\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'Rex makes a sound' بیا ریښتیا"
            },
            {
              "icon": "",
              "label": "نامعلوم بیا ناسم"
            },
            {
              "icon": "",
              "label": "دا یو TypeError غورځوي"
            },
            {
              "icon": "",
              "label": "'Rex makes a sound' بیا ناسم"
            }
          ]
        },
        {
          "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);\nدوه کرښې څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "1 بیا نامعلوم"
            },
            {
              "icon": "",
              "label": "1 بیا 0"
            },
            {
              "icon": "",
              "label": "1 بیا 1"
            },
            {
              "icon": "",
              "label": "دا یو SyntaxError غورځوي"
            }
          ]
        },
        {
          "question": "const items = ['a', 'b'];\nconst label = `Items: ${items.length > 0 ? items.join(', ') : 'none'}`;\nconsole.log(label);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "'Items: ${items.length > 0 ? items.join(\\', \\') : \\'none\\'}'"
            },
            {
              "icon": "",
              "label": "'Items: none'"
            },
            {
              "icon": "",
              "label": "'Items: a, b'"
            },
            {
              "icon": "",
              "label": "دا یو SyntaxError غورځوي"
            }
          ]
        },
        {
          "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);\nدا څه چاپوي؟",
          "options": [
            {
              "icon": "",
              "label": "60 [1, 2, 3, 4, 5]"
            },
            {
              "icon": "",
              "label": "60 [2, 4, 20, 40]"
            },
            {
              "icon": "",
              "label": "150 [1, 2, 3, 4, 5]"
            },
            {
              "icon": "",
              "label": "60 [20, 40]"
            }
          ]
        }
      ],
      "optionOrderVersion": "7335aa056fc9d33a"
    }
  },
  "testNames": {
    "javascript-test": "د جاوا سکریپټ ازموینه"
  }
}
