{
  "assessmentTests": {
    "javascript_test": {
      "name": "ஜாவாஸ்கிரிப்ட் தேர்வு",
      "desc": "அடிப்படை சிண்டாக்ஸ் மற்றும் கோயர்ஷன், ஃபங்ஷன்கள்/ஸ்கோப்/க்ளோசர்கள் மற்றும் this, ஆப்ஜெக்ட்கள்/அரேக்கள் மற்றும் தரவு அமைப்புகள், ஈவென்ட் லூப்/ஆசிங்க்/ப்ரோடோடைப் இடியம்கள் ஆகியவை குறித்த 30 சூழ்நிலைக் கேள்விகள் — வேலை அறிவிப்பு ஜாவாஸ்கிரிப்ட் திறமை என்று குறிப்பிடுவதுடன் உங்கள் ஜாவாஸ்கிரிப்ட் அறிவு பொருந்துகிறதா என்பதைக் கண்டறியுங்கள்.",
      "recommendation": "உங்கள் ஜாவாஸ்கிரிப்ட் திறன் புரொஃபைல்",
      "results": {
        "beginner": {
          "name": "தொடக்கநிலை",
          "desc": "நீங்கள் செயல்படும் ஃபங்ஷன்களையும் ஆப்ஜெக்ட்களையும் எழுத முடியும், ஆனால் நீங்கள் தவறவிட்ட கேள்விகள் சிண்டாக்ஸைச் சுற்றி அல்லாமல், வகை கோயர்ஷன் மற்றும் ரெஃபரன்ஸ் செமான்டிக்ஸைச் சுற்றியே குவிந்துள்ளன — ஒப்பிடுவதற்கு முன் == அமைதியாக வகைகளை மாற்றுதல், ஒரு அரே அசைன்மெண்ட் ஆப்ஜெக்ட்டை நகலெடுக்காமல் அதையே பகிர்தல், NaN ஏன் தனக்குத்தானே ஒருபோதும் சமமாவதில்லை என்பவை. இவற்றில் எதுவும் நீங்கள் ஜாவாஸ்கிரிப்டில் மோசமாக இருப்பதைப் பற்றியது அல்ல; மதிப்புகளும் ரெஃபரன்ஸ்களும் உண்மையில் எவ்வாறு நடந்துகொள்கின்றன என்பதைக் கற்றுக்கொள்வதற்குப் பதிலாக, தற்செயலாக வேலை செய்த குறியீட்டை எழுதுவதன் மூலம் மொழியைக் கற்றவர்களைத் தடுமாறச் செய்யும் குறிப்பிட்ட விதிகள் இவை. இவை பணியிடத்தில் முக்கியம், ஏனெனில் ஒவ்வொன்றும் குறியீடு எந்தப் பிழையும் இல்லாமல் இயங்கி, இன்னும் தவறான செயலைச் செய்யும் இடமாகும்.",
          "recommendation": "இந்த வரிசையில் மூன்று விஷயங்களுடன் தொடங்குங்கள்: ஒப்பிடுவதற்கு முன் == ஏன் வகைகளைத் தானாக மாற்றுகிறது, === ஏன் மாற்றுவதில்லை, ஒரு அரே அல்லது ஆப்ஜெக்ட்டைப் புதிய மாறிக்கு ஒதுக்கும்போது மதிப்பை அல்லாமல் ரெஃபரன்ஸ் ஏன் நகலெடுக்கப்படுகிறது, மற்றும் லெட்டும் கான்ஸ்ட்டும் அவற்றின் அறிவிப்பு இயங்கும் வரை டெம்ப்போரல் டெட் சோனில் இருக்கும் நிலையில், வார் எவ்வாறு ஹாய்ஸ்ட் செய்யப்பட்டு அன்டிஃபைன்டு என தொடக்க மதிப்பு பெறுகிறது. MDN-இன் ஜாவாஸ்கிரிப்ட் வழிகாட்டி இம்மூன்றையும் இயக்கிப் பார்க்கக்கூடிய எடுத்துக்காட்டுகளுடன் விளக்குகிறது."
        },
        "intermediate": {
          "name": "இடைநிலை",
          "desc": "ஃபங்ஷன்கள், அரே மெத்தட்கள், எளிய கட்டுப்பாட்டு ஓட்டம் போன்ற அன்றாட அப்ளிகேஷன் குறியீட்டை நீங்கள் சௌகரியமாகக் கையாளுகிறீர்கள் — வழக்கமான அம்சப் பணிகளால் உங்கள் வேகம் குறையாது. இங்கிருந்து மேம்பட்ட நிலை வரையிலான இடைவெளி பெரும்பாலும், ஜாவாஸ்கிரிப்டின் ஸ்கோப் மற்றும் நேர விதிகள் ஒன்றோடொன்று இணையும்போது என்ன நடக்கிறது என்பதில் உள்ளது: லூப்பின் கால்பேக்குகளுக்குள் பிடிக்கப்பட்டு, அனைத்தும் ஒரே இறுதி மதிப்பையே படிக்கும் வார் மாறி; ஒரு மெத்தட் அதன் ஆப்ஜெக்ட்டிலிருந்து பிரிக்கப்பட்டவுடன் அமைதியாக அந்த ஆப்ஜெக்ட்டைச் சுட்டுவதை நிறுத்தும் திஸ்; ஆழமாகத் தோன்றினாலும் ஒரு நிலையை மட்டுமே நகலெடுக்கும் ஸ்ப்ரெட் நகல். விரைவாகப் படித்துப் பார்க்கும்போது தப்பிவிடும், குறிப்பிட்ட ரன்டைம் நிலையில் மட்டுமே வெளிப்படும் பிழைகள் இவையே.",
          "recommendation": "வரையறுக்கும் நேரத்தில் அல்லாமல் அழைக்கும் நேரத்தில் ஸ்கோப்பும் திஸ்ஸும் உண்மையில் எவ்வாறு தீர்மானிக்கப்படுகின்றன என்பதில் கவனம் செலுத்துங்கள்: வார் அடிப்படையிலான ஃபார் லூப் ஏன் ஒவ்வொரு கால்பேக்குக்கும் ஒரே இறுதிக் கவுண்டர் மதிப்பைத் தருகிறது, லெட் ஏன் தருவதில்லை, திஸ் என்பது ஒரு ஃபங்ஷன் எங்கே எழுதப்பட்டுள்ளது என்பதால் அல்லாமல் எப்படி அழைக்கப்படுகிறது என்பதால் தீர்மானிக்கப்படுவது எப்படி, ஸ்ப்ரெட் அல்லது ஆப்ஜெக்ட் அசைன் ஏன் ஒரு ஆப்ஜெக்ட்டின் மேல்நிலையை மட்டுமே நகலெடுக்கிறது. பிறகு ஈவென்ட் லூப் — ஏனெனில் ப்ராமிஸ்களைத் தனித்தனியாக ஏற்கெனவே அறிந்தவர்களையும் அதுவே தடுமாறச் செய்கிறது."
        },
        "advanced": {
          "name": "உயர்நிலை",
          "desc": "பெரும்பாலான வேலை அறிவிப்புகள் “வலுவான ஜாவாஸ்கிரிப்ட்” என்பதன் மூலம் குறிப்பிடும் நிலை இதுவே. ஃபில்ட்டர்/மேப்/ரிட்யூஸ் சங்கிலியைப் படித்து, அசல் அரேயை மாற்றாமல் அது என்ன திருப்பித் தரும் என்பதைத் துல்லியமாக முன்கூட்டியே சொல்ல முடியும்; ஒத்திசைவான கன்சோல் லாக் எப்போதும் மைக்ரோடாஸ்க்கை முந்துகிறது, அது எப்போதும் செட்டைம்அவுட்டை முந்துகிறது என்பது உங்களுக்குத் தெரியும்; ப்ராமிஸ்.ஆல் என்பதை நாடுகிறீர்கள், எந்த ஒரு ப்ராமிஸ் நிராகரிக்கப்பட்டாலும் மீதியைக் காத்திராமல் அது உடனே நிராகரிக்கும் என்பதை அறிந்து. இந்த நிலையை உயர்ந்த நிலையிலிருந்து பிரிப்பது பணியின் ப்ரோட்டோடைப் மற்றும் ஆப்ஜெக்ட்-மாடல் பகுதி: ப்ரோட்டோடைப் சங்கிலி மரபுவழி வந்த மெத்தடையும் ஹேஸ்ஓன்ப்ராப்பர்ட்டியையும் எவ்வாறு தீர்க்கிறது, மற்றும் ஒரு பிரைவேட் கிளாஸ் ஃபீல்டு உண்மையில் எதை மறைக்கிறது.",
          "recommendation": "பிற குறியீடும் தொடும் ஸ்டேட்டைப் பாதுகாக்கும் பகுதிகளில் ஆழமாகச் செல்லுங்கள்: இன்ஸ்டன்ஸிலேயே இல்லாத மெத்தட் தேடல்களை ஜாவாஸ்கிரிப்டின் ப்ரோட்டோடைப் சங்கிலி எவ்வாறு தீர்க்கிறது, ஒரு கிளாஸின் பிரைவேட் #ஃபீல்டுகள் வெளிப்புற அணுகலிலிருந்து உண்மையில் எதை மறைக்கின்றன, சாதாரண ஆப்ஜெக்ட்டுக்குள்ளும் அரேக்குள்ளும் அன்டிஃபைண்டையும் ஃபங்ஷன்களையும் JSON ஸ்ட்ரிங்கிஃபை எவ்வாறு வெவ்வேறாகக் கையாள்கிறது. ஈவென்ட் லூப், ப்ரோட்டோடைப் சங்கிலி பற்றிய MDN-இன் உள்ளடக்கம் இவ்விரண்டுக்கும் இயல்பான அடுத்த நிறுத்தம்."
        },
        "expert": {
          "name": "நிபுணர்",
          "desc": "ஒவ்வொரு பிரிவிலும் நீங்கள் உச்ச மதிப்பெண் பெற்றீர்கள் — அடிப்படை சிண்டாக்ஸ், வகைகள் மற்றும் கோயர்ஷன்; ஃபங்ஷன்கள், ஸ்கோப், க்ளோசர்கள் மற்றும் this; ஆப்ஜெக்ட்கள், அரேக்கள் மற்றும் தரவு அமைப்புகள்; ஆசிங்க், ஈவென்ட் லூப், ப்ரோடோடைப்கள் மற்றும் இடியம்கள். நடைமுறையில், அறிமுகமில்லாத ஒருவரின் ஃபங்ஷனை உங்களிடம் கொடுத்தால், சிண்டாக்ஸ் என்ன செய்ய வேண்டும் என்று சொல்கிறது என்பதை மட்டுமல்லாமல், அது ஏன் அதைத் திருப்பித் தருகிறது என்பதையும் உங்களால் விளக்க முடியும்; இது கடினமான, அதிக மதிப்புள்ள திறன். இந்த நிலையில் மொழியே அரிதாகவே தடையாக இருக்கும்; தடை பொதுவாக ஆசிங்க் கட்டுப்பாட்டு ஓட்டம் அல்லது அதன் அடியில் உள்ள தரவின் வடிவமைப்பாக இருக்கும்.",
          "recommendation": "இப்போது பலன்கள் வடிவமைப்பிலும் பிரச்சினை கண்டறிதலிலும் உள்ளன: ப்ராமிஸ்.ஆல் மற்றும் ப்ராமிஸ்.ரேஸ் ஆகியவற்றின் வரையறைகளை ஒப்பிப்பதற்குப் பதிலாக அவற்றுக்கிடையேயான ரேஸ் கண்டிஷனைப் பற்றிச் சிந்திப்பது, தனிப்பட்ட ஸ்டேட்டுக்கு க்ளோஷர் எப்போது சரியான கருவி, கிளாஸின் பிரைவேட் ஃபீல்டு எப்போது சரியான கருவி என்பதைத் தேர்வது, ஒரு வினாடி வினாவில் அல்லாமல் புரொடக்ஷன் லாக்குகளில் மைக்ரோடாஸ்க்-மேக்ரோடாஸ்க் வரிசைப் பிழையைப் படித்தறிவது. ஒரு பணிக்கான தேர்வு வடிகட்டலில் இருந்தால், ஜாவாஸ்கிரிப்ட் அம்சங்களின் பெயர்களைச் சொல்வதற்குப் பதிலாக, நீங்கள் கண்டறிந்த ஒரு நேரப் பிழையை — காலாவதியான க்ளோஷர் மாறி அல்லது வரிசை தவறிய அசிங்க் கால்பேக் — விவரியுங்கள்; அது சொல்வளத்தை மட்டுமல்ல, சிந்தனையையும் வெளிப்படுத்துகிறது."
        }
      },
      "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 நிபந்தனையில் பயன்படுத்தும்போது பின்வருவனவற்றில் எது ட்ரூத்தியாகக் கருதப்படும்?",
          "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": "அன்டிஃபைன்டு, பிறகு அன்டிஃபைன்டு"
            },
            {
              "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": "அரோ ஃபங்ஷன்கள் ஸ்டார்ட் மெத்தடின் திஸ்ஸையே பயன்படுத்துகின்றன; அது டைமர் ஆப்ஜெக்ட்டைக் குறிக்கும்"
            },
            {
              "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": "'unknown', பிறகு 'unknown'"
            },
            {
              "icon": "",
              "label": "0, பிறகு 'unknown'"
            },
            {
              "icon": "",
              "label": "0, பிறகு undefined"
            },
            {
              "icon": "",
              "label": "'unknown', பிறகு 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', பிறகு true"
            },
            {
              "icon": "",
              "label": "undefined, பிறகு false"
            },
            {
              "icon": "",
              "label": "இது TypeError-ஐ எறியும்"
            },
            {
              "icon": "",
              "label": "'Rex makes a sound', பிறகு 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);\nஇரண்டு வரிகளும் என்ன அச்சிடும்?",
          "options": [
            {
              "icon": "",
              "label": "1, பிறகு undefined"
            },
            {
              "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": "ஜாவாஸ்கிரிப்ட் தேர்வு"
  }
}
