سوالات جاوا اسکریپتی برای مصاحبه (قسمت ۱)

لینک زیر که حدود 90 سوال چالشی ایه جاوا اسکریپته رو دوست خوبم حمیدرضا جان برای من ارسال کردن و من تصمیم گرفتم در چند قسمت این سوالات رو برای شما دوستان خوبم ترجمه کنم.https://github.com/lydiahallie/javascript-questionsاگه مصاحبه‌ی یکی از شرکت‌های بزرگ (چه ایرانی و چه غیرایرانی) رو رفته باشین، از همین سوالات js core ای ازتون سوال میپرسنپاسخ سوالات رو در انتهای مقاله نوشتم.توی کامنت‌ها بهم بگین که اگه واستون مفید بوده ادامه سوالات رو ترجمه کنم یا چی؟سوال اول: خروجی کد زیر بنظرتون کدوم گزینه میشه؟ https://gist.github.com/2012mjm/604fa78f29ca082b8a5c7a5da666c9a1 A: Lydia and undefinedB: Lydia and ReferenceErrorC: ReferenceError and 21D: undefined and ReferenceErrorسوال دوم: خروجی این یکی کد کدوم گزینست ؟ https://gist.github.com/2012mjm/75267606418fb8b3a7b025a7a232f40a A: 0 1 2 and 0 1 2B: 0 1 2 and 3 3 3C: 3 3 3 and 0 1 2سوال سوم: بازم خروجی این یکی کد کدوم گزینست ؟ https://gist.github.com/2012mjm/7e238564c99c802f92e1b442fa927ef2 A: 20 and 62.83185307179586B: 20 and NaNC: 20 and 63D: NaN and 63سوال چهارم: خروجی چیه ؟ https://gist.github.com/2012mjm/9e2b758dd5562c9f2512297d490d1ffe A: 1 and falseB: false and NaNC: false and falseسوال پنجم: کدام یک از گزینه‌ها درست است؟ https://gist.github.com/2012mjm/9ddb0aea847098e6f02b7743ebfecb98 A: mouse.bird.size is not validB: mouse[bird.size] is not validC: mouse[bird["size"]] is not validD: All of them are validسوال ششم: خروجی کد زیر چی میشه؟ https://gist.github.com/2012mjm/32039598fc8e20f577f6395e3bb1890c A: HelloB: Hey!C: undefinedD: ReferenceErrorE: TypeErrorسوال هفتم: خروجی کدومه؟ https://gist.github.com/2012mjm/66b4098ef63452d3f416b25887b0d335 A: true false trueB: false false trueC: true false falseD: false true trueسوال هشتم: خروجی ؟ https://gist.github.com/2012mjm/11c6161eec08b16a89a23682b70167b5 A: orangeB: purpleC: greenD: TypeErrorسوال نهم: خروج؟ https://gist.github.com/2012mjm/3e14389cc0fcd94601dd5ea1738669a9 A: {}B: ReferenceError: greetign is not definedC: undefinedسوال دهم: خ؟ https://gist.github.com/2012mjm/9433b1b10b82e83aa9b7a15f79847d8e A: Nothing, this is totally fine!B: SyntaxError. You cannot add properties to a function this way.C: "Woof" gets logged.D: ReferenceErrorخب حالا میریم سراغ پاسخ سوالاتجواب سوال اول گزینه D میشهدر کنسول لاگ اول، جاوا اسکریپت سعی داره مقدار متغیر name رو لاگ کنه و چون هنوز تعریف نشده، میگرده ببینه جایی تعریفش کردین یا نه، خب میبینه اون پایین یه متغیر از نوع var با نام name ایجاد شده، پس واسه name مقدار undefined رو لاگ میکنه (چون هنوز به خط انتصاب مقدارش نرسیده)، در کنسول لاگ دوم بازم جاوا اسکریپت تلاش میکنه متغیر age رو چاپ کنه، ولی باز میگه مرد حسابی منو مسخره کردی، اینم خو هنوز تعریف نکردی، ولی خب وظیفش اینکه بگرده ببینه جایی پایین تر تعریفش کردی یا نه، خب میبینه این متغیر از اون نوع let تعریف شده، ولی برخلاف متغیرهای var مقدار undefined رو چاپ نمیکنه بلکه ReferenceError میده، چون میگه باید قبلش تعریفش میکردی، یه نکته هم اینکه رفتار const هم شبیه let میمونهجواب سوال دوم گزینه C میشهبه این دلیل که جاوا اسکریپت به صورت event queue کار میکنه، دستورات درون callback function در setTimeout بعد از loop اجرا میشن، در loop اول نوع متغیر i از جنس var تعریف شده، در نتیجه این متغیر به صورت global تعریف میشه، پس در مرحله‌ی آخر loop مقدار 3 رو به خودش میگیره و در نهایت setTimeout سه بار 3 رو نمایش میده، در loop دوم نوع متغیر این بار از جنس let تعریف شده، و این نوع متغیر اصطلاحاً block-scoped عه و در بین همون آکولادهای loop فقط زنده میمونه، و هر سری مقدار هر step رو نمایش میده، const هم شبیه let عمل میکنه.جواب سوال سوم گزینه B میشهبه تابع diameter میگن regular function و به تابع perimeter میگن arrow function، در arrow function ها، کلمه‌ی this به scope خودش اشاره میکنه، نه به shape objectجواب سوال چهارم گزینه A میشهاون علامت + پشت true تلاش میکنه یک عملوند رو به عدد تبدیل کنه، true میشه 1 و false میشه 2رشته‌ی Lydia یک مقدار درست و صحیح محسوب میشه، حالا ما با علامت تعجب پشتش داریم ازش میپرسیم که آیا این مقدار درستی که داری، یک مقدار اشتباست؟ که منطقاً جواب false میده بهمونجواب سوال پنجم گزینه A میشهدر جاوا اسکریپت، تمام کلیدهای object از نوع رشته‌ای هستند (مگر اینکه Symbol باشند). حتی اگر ما کلید‌ها رو به صورت یک رشته تعریف نکنیم باز اونا رو به زیر رشته تبدیل میکنه.گزینه B به این صورت تفسیر میشه که ابتدا مقدار bird.size را بدست میاره که میشه small و سپس مقدار ["mouse["small که میشه true رو برمیگردونه، گزینه C هم به همین صورتهاما در این صورت مسئله، علامت dot در گزینه A به ما جواب درستی نمیده، چون mouse.bird به ما undefined رو برمیگردونه و بعد میگه undefined.size که یک دستور اشتباست و مفسر خطا میدهجواب سوال ششم گزینه A میشهدر جاوا اسکریپت همه‌ی object ها به وسیله‌ی reference با هم تعامل دارن، در متغیر c ما یک آبجکت رو با reference اون نگه داشتیم، حالا وقتی مقدار c رو توی d میریزید عین این میمونه d هم به همون آبجکت متصل شدهوقتی شما یک object رو تغییر بدید، همه‌ی اون‌ها رو تغییر دادید.جواب سوال هفتم گزینه C میشهنوع new Number یک built-in function constructor عه، در نگاه اول یک عدد به نظر میرسه ولی واقعاً یک عدد نیست، و این یه سری ویژگی‌های اضافی داره و همینطور یک object عه، وقتی از == استفاده می‌کنید فقط دارید مقدارشون رو بررسی میکنید که هر دو 3 هستن ولی وقتی از === استفاده می‌کنید هم مقدارش و هم نوعش رو بررسی میکنید.جواب سوال هشتم گزینه D میشهتابع colorChange یک تابع static عه و نمیتونید از طریق child بهش برسید، بنابراین freddie یک child عه و تابع colorChange در این شرایط در در دسترس نیست.جواب سوال نهم گزینه A میشهبه کد صورت مسئله خوب دقت کردید؟ ... اولی greeting و دومی greetign، ولی جاوا اسکریپت مقدار اون رو به درستی چاپ میکنه و خطایی رخ نمیده، جاوا اسکریپت اون رو به صورت global.greetign یا window.greetign با مقدار یک empty object در نظر میگیره، اگه میخوایید به جاوا اسکریپت اجبار کنید که متغیرهامون حتما type داشته باشن باید از کلمه کلیدی use strict استفاده کنید.جواب سوال دهم گزینه A میشهتعجب نکنید! چنین چیزی در جاوا اسکریپت امکان پذیره، زیرا function ها یک نوع خاصی از object ها هستند. (همه چیز در کنار primitive type ها یک نوع object هستند.)