{
  "assessmentTests": {
    "javascript_test": {
      "name": "Tes JavaScript",
      "desc": "30 pitakon skenario babagan sintaksis inti lan koersi, fungsi/scope/closure lan this, objek/array lan struktur data, uga idiom event loop/async/prototype — mangga priksa apa JavaScript panjenengan cocog karo sing dikarepaké ing lowongan pagawean nalika nyebut kaprigelan JavaScript.",
      "recommendation": "Profil kaprigelan JavaScript panjenengan",
      "results": {
        "beginner": {
          "name": "Pemula",
          "desc": "Panjenengan saged nyerat fungsi lan objek ingkang jalan, nanging pitakon ingkang wangsulanipun lepat klempakan ing babagan koersi tipe lan semantik referensi, sanes sintaksis — == meneng-menengan ngowahi tipe saderengipun mbandhingaké, assignment array ingkang nuduhaké siji objek bebarengan tinimbang nyalin, lan kenging menapa NaN mboten nate sami kaliyan dhirinipun piyambak. Sedaya punika sanes babagan kirang pinter JavaScript; punika aturan-aturan khusus ingkang njebak tiyang ingkang sinau basa punika kanthi nyerat kode ingkang kebeneran jalan, sanes kanthi sinau kados pundi nilai lan referensi saestu tumindak. Perkawis-perkawis punika wigati ing pagawean amargi saben siji dados titik ingkang kode mlaku tanpa error nanging taksih ngasilaké asil ingkang lepat.",
          "recommendation": "Wiwiti kaliyan tigang perkawis, kanthi urutan punika: kenging menapa == ngowahi tipe saderengipun mbandhingaké dene === mboten, kenging menapa nyelehaké siji array utawi objek ing variabel enggal namung nyalin referensi, sanes nilainipun, lan kados pundi var dihoist lan diinisialisasi dados undefined dene let lan const tetep wonten ing temporal dead zone ngantos deklarasinipun ditindakaké. Pandhuan JavaScript saking MDN ngrembag sedaya tigang perkawis punika kanthi tuladha ingkang saged dijalanaké."
        },
        "intermediate": {
          "name": "Menengah",
          "desc": "Panjenengan nangani kode aplikasi saben dinten kanthi mantep — fungsi, metode array, alur kontrol ingkang prasaja — lan mboten bakal kalem nalika nggarap fitur rutin. Bedanipun antawis tingkat punika kaliyan tingkat Lanjut umumipun wonten ing napa ingkang kedadosan nalika aturan scope lan wektu ing JavaScript saling pengaruh: var ingkang katangkep ing callback-callback njero loop lan sedayanipun maca nilai pungkasan ingkang sami, this ingkang meneng-menengan mboten nuding objek malih sasampunipun metode dipisahaké saking objekipun, salinan spread ingkang katingal jero nanging namung nyalin setunggal tingkat. Punika jinising bug ingkang lolos nalika diwaca sepintas lan namung muncul ing kondisi runtime tartamtu.",
          "recommendation": "Mangga fokus ing kados pundi scope lan this saestu ditemtokaké nalika dipanggil, sanes nalika ditulis: kenging menapa for loop kanthi var maringaké nilai counter pungkasan ingkang sami dhateng saben callback dene let mboten, kados pundi this ditemtokaké dening cara fungsi dipanggil, sanes panggenan fungsi punika ditulis, lan kenging menapa spread utawi Object.assign namung nyalin tingkat ndhuwur saking objek. Salajengipun event loop, amargi punika ingkang njebak tiyang ingkang sampun mangertos promise kanthi piyambak-piyambak."
        },
        "advanced": {
          "name": "Lanjutan",
          "desc": "Punika tingkat ingkang biasanipun dipun-maksud dening lowongan kerja kanthi “JavaScript ingkang mantep.” Panjenengan maca ranté filter/map/reduce lan saged ngramalaké kanthi pas napa ingkang dipunwangsulaké tanpa ngowahi array asli, panjenengan mangertos kenging menapa console.log sinkron tansah rumiyin tinimbang microtask ingkang tansah rumiyin tinimbang setTimeout, lan panjenengan milih Promise.all kanthi mangertos bilih punika reject ing wektu salah setunggal promise reject, mboten ngentosi sisanipun. Ingkang misahaké tingkat punika saking pucuk inggih punika sisih prototype lan model objek: kados pundi prototype chain nemtokaké metode warisan dibandhingaké hasOwnProperty, lan napa ingkang saestu didhelikaké dening private field ing class.",
          "recommendation": "Mangga sinau langkung jero babagan bagian-bagian ingkang njaga state ingkang ugi disentuh kode sanes: kados pundi prototype chain JavaScript nemtokaké panelusuran metode ingkang mboten wonten ing instance-ipun piyambak, napa ingkang saestu didhelikaké private #fields ing class saking akses njawi, lan kados pundi JSON.stringify nangani undefined lan fungsi kanthi beda ing njero objek biasa dibandhingaké ing njero array. Materi MDN babagan event loop lan prototype chain punika sumber ingkang pas kangge langkah salajengipun kangge kalih topik punika."
        },
        "expert": {
          "name": "Ahli",
          "desc": "Panjenengan angsal skor paling inggil ing saben bagian — sintaksis inti, tipe lan koersi; fungsi, scope, closure lan this; objek, array lan struktur data; lan async, event loop, prototype lan idiom. Kanthi praktis, tegesipun panjenengan saged diparingi fungsi saking tiyang sanes lan nerangaké kenging menapa fungsi punika ngasilaké nilai punika, sanes namung napa ingkang dituturaké dening sintaksis, ingkang minangka kaprigelan ingkang langkung angel lan langkung migunani. Ing tingkat punika, basa piyambak arang dados watesan; watesanipun biasanipun alur kontrol async utawi wujud data ing ngandhapipun.",
          "recommendation": "Kauntungan sapunika wonten ing desain lan diagnosis: nalar bab race condition antawis Promise.all lan Promise.race tinimbang namung ngapalaké definisinipun, milih kapan closure punika piranti ingkang trep kangge state pribadi tinimbang kapan private field ing class ingkang trep, lan maca bug urutan microtask-vs-macrotask ing log produksi tinimbang ing kuis. Menawi panjenengan dipun-screening kangge sawijining peran, mangga criyosaken bug wektu ingkang panjenengan temokaké — variabel closure ingkang nyimpen nilai lawas utawi callback async ingkang mlaku mboten urut — tinimbang namung nyebataken fitur JavaScript; punika nuduhaké nalarnipun, sanes namung kosakatanipun."
        }
      },
      "questions": [
        {
          "question": "console.log(x);\nvar x = 5;\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "5"
            },
            {
              "icon": "",
              "label": "ReferenceError: x is not defined"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "null"
            }
          ]
        },
        {
          "question": "console.log(y);\nlet y = 5;\nMenapa ingkang kedadosan?",
          "options": [
            {
              "icon": "",
              "label": "Nuwuhaké ReferenceError"
            },
            {
              "icon": "",
              "label": "Nampilaké undefined"
            },
            {
              "icon": "",
              "label": "Nampilaké 5"
            },
            {
              "icon": "",
              "label": "Nuwuhaké SyntaxError"
            }
          ]
        },
        {
          "question": "const arr = [1, 2, 3];\narr.push(4);\nconsole.log(arr.length);\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "4"
            },
            {
              "icon": "",
              "label": "Nuwuhaké TypeError"
            },
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            }
          ]
        },
        {
          "question": "console.log('' == 0);\nconsole.log('' === 0);\nMenapa ingkang ditampilaké kalih baris punika?",
          "options": [
            {
              "icon": "",
              "label": "true banjur true"
            },
            {
              "icon": "",
              "label": "false banjur false"
            },
            {
              "icon": "",
              "label": "true banjur false"
            },
            {
              "icon": "",
              "label": "Nuwuhaké TypeError"
            }
          ]
        },
        {
          "question": "console.log(NaN === NaN);\nconsole.log(Number.isNaN(NaN));\nMenapa ingkang ditampilaké kalih baris punika?",
          "options": [
            {
              "icon": "",
              "label": "true banjur true"
            },
            {
              "icon": "",
              "label": "Nuwuhaké TypeError"
            },
            {
              "icon": "",
              "label": "false banjur false"
            },
            {
              "icon": "",
              "label": "false banjur true"
            }
          ]
        },
        {
          "question": "console.log(typeof null);\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "\"null\""
            },
            {
              "icon": "",
              "label": "\"object\""
            },
            {
              "icon": "",
              "label": "\"undefined\""
            },
            {
              "icon": "",
              "label": "\"boolean\""
            }
          ]
        },
        {
          "question": "Pundi saking ing ngandhap punika ingkang truthy menawi digunakaké ing kondisi if?",
          "options": [
            {
              "icon": "",
              "label": "0"
            },
            {
              "icon": "",
              "label": "“” (string kosong)"
            },
            {
              "icon": "",
              "label": "null"
            },
            {
              "icon": "",
              "label": "“0” (string nol)"
            }
          ]
        },
        {
          "question": "foo();\nfunction foo() { console.log('a'); }\nbar();\nvar bar = function() { console.log('b'); };\nMenapa ingkang kedadosan?",
          "options": [
            {
              "icon": "",
              "label": "Kalih-kalihipun panggilan nampilaké: “a” lan salajengipun “b”"
            },
            {
              "icon": "",
              "label": "foo() nampilaké “a”; bar() nuwuhaké TypeError"
            },
            {
              "icon": "",
              "label": "foo() lan bar() kalih-kalihipun nuwuhaké ReferenceError"
            },
            {
              "icon": "",
              "label": "foo() nuwuhaké ReferenceError; bar() nampilaké “b”"
            }
          ]
        },
        {
          "question": "function makeCounter() {\n  let count = 0;\n  return function() { count++; return count; };\n}\nconst counter = makeCounter();\nconsole.log(counter());\nconsole.log(counter());\nMenapa ingkang ditampilaké kalih baris punika?",
          "options": [
            {
              "icon": "",
              "label": "1 lajeng 1"
            },
            {
              "icon": "",
              "label": "NaN lajeng NaN"
            },
            {
              "icon": "",
              "label": "undefined lajeng undefined"
            },
            {
              "icon": "",
              "label": "1 lajeng 2"
            }
          ]
        },
        {
          "question": "for (var i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "0, 1, 2"
            },
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "Nuwuhaké ReferenceError"
            },
            {
              "icon": "",
              "label": "undefined, undefined, undefined"
            }
          ]
        },
        {
          "question": "for (let i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "Nuwuhaké 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));\nMenapa ingkang ditampilaké kode punika?",
          "options": [
            {
              "icon": "",
              "label": "“Hi, Ana”"
            },
            {
              "icon": "",
              "label": "“Hi, undefined”"
            },
            {
              "icon": "",
              "label": "Nuwuhaké TypeError"
            },
            {
              "icon": "",
              "label": "“Hi, ${this.name}”"
            }
          ]
        },
        {
          "question": "const timer = {\n  seconds: 0,\n  start: function() {\n    setInterval(() => { this.seconds++; }, 1000);\n  },\n};\nKenging menapa tiyang langkung milih arrow function tinimbang function() { this.seconds++ } ing njero setInterval ing kasus punika?",
          "options": [
            {
              "icon": "",
              "label": "Arrow function nggunakaké this saking start, inggih punika timer"
            },
            {
              "icon": "",
              "label": "Arrow function mlaku luwih cepet tinimbang fungsi biasa"
            },
            {
              "icon": "",
              "label": "Arrow function ngiket konteks marang obyek global"
            },
            {
              "icon": "",
              "label": "Arrow function ngowahi konteks dadi variabel global"
            }
          ]
        },
        {
          "question": "function multiply(a, b) { return a * b; }\nconst double = multiply.bind(null, 2);\nconsole.log(double(5));\nApa sing bakal dicithak dening kode punika?",
          "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();\nApa sing bakal dicithak dening rong console.log punika?",
          "options": [
            {
              "icon": "",
              "label": "20 banjur 20"
            },
            {
              "icon": "",
              "label": "20 banjur 10"
            },
            {
              "icon": "",
              "label": "10 banjur 10"
            },
            {
              "icon": "",
              "label": "Nuwuhaké SyntaxError"
            }
          ]
        },
        {
          "question": "const a = [1, 2, 3];\nconst b = a;\nb.push(4);\nconsole.log(a.length);\nApa sing bakal dicithak dening kode punika?",
          "options": [
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "Nuwuhaké 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);\nApa sing bakal dicithak dening kode punika?",
          "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);\nApa sing bakal dicithak dening kode punika?",
          "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);\nApa sing bakal dicithak dening kode punika?",
          "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);\nApa sing bakal dicithak dening kode punika?",
          "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');\nApa sing bakal dicithak dening rong baris punika?",
          "options": [
            {
              "icon": "",
              "label": "'unknown' banjur 'unknown'"
            },
            {
              "icon": "",
              "label": "0 banjur 'unknown'"
            },
            {
              "icon": "",
              "label": "0 banjur undefined"
            },
            {
              "icon": "",
              "label": "'unknown' banjur 0"
            }
          ]
        },
        {
          "question": "const obj = { a: undefined, b: function(){}, c: NaN, d: [undefined, function(){}, 1] };\nconsole.log(JSON.stringify(obj));\nApa sing bakal dicithak dening kode punika?",
          "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": "Nuwuhaké TypeError"
            }
          ]
        },
        {
          "question": "console.log('1');\nsetTimeout(() => console.log('2'), 0);\nPromise.resolve().then(() => console.log('3'));\nconsole.log('4');\nUrutan kepriye sing bakal dicithak?",
          "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');\nUrutan kepriye sing bakal dicithak?",
          "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));\nApa sing bakal dicithak dening kode punika?",
          "options": [
            {
              "icon": "",
              "label": "'fail err'"
            },
            {
              "icon": "",
              "label": "'ok' [1, 3]"
            },
            {
              "icon": "",
              "label": "'ok' [1, undefined, 3]"
            },
            {
              "icon": "",
              "label": "Muncul error, lan ora ana handler sing mlaku"
            }
          ]
        },
        {
          "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));\nApa sing bakal dicithak dening kode punika?",
          "options": [
            {
              "icon": "",
              "label": "'slow'"
            },
            {
              "icon": "",
              "label": "['fast', 'slow']"
            },
            {
              "icon": "",
              "label": "'fast'"
            },
            {
              "icon": "",
              "label": "Nuwuhaké 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'));\nApa sing bakal dicithak dening rong baris punika?",
          "options": [
            {
              "icon": "",
              "label": "'Rex makes a sound' banjur true"
            },
            {
              "icon": "",
              "label": "undefined banjur false"
            },
            {
              "icon": "",
              "label": "Nuwuhaké TypeError"
            },
            {
              "icon": "",
              "label": "'Rex makes a sound' banjur false"
            }
          ]
        },
        {
          "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);\nApa sing bakal dicithak dening rong baris punika?",
          "options": [
            {
              "icon": "",
              "label": "1 banjur undefined"
            },
            {
              "icon": "",
              "label": "1 banjur 0"
            },
            {
              "icon": "",
              "label": "1 lajeng 1"
            },
            {
              "icon": "",
              "label": "Nuwuhaké SyntaxError"
            }
          ]
        },
        {
          "question": "const items = ['a', 'b'];\nconst label = `Items: ${items.length > 0 ? items.join(', ') : 'none'}`;\nconsole.log(label);\nApa sing bakal dicithak dening kode punika?",
          "options": [
            {
              "icon": "",
              "label": "'Items: ${items.length > 0 ? items.join(\\', \\') : \\'none\\'}'"
            },
            {
              "icon": "",
              "label": "'Items: none'"
            },
            {
              "icon": "",
              "label": "'Items: a, b'"
            },
            {
              "icon": "",
              "label": "Nuwuhaké 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);\nApa sing bakal dicithak dening kode punika?",
          "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": "Tes JavaScript"
  }
}
