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

لینک زیر که حدود 90 سوال چالشی ایه جاوا اسکریپته رو دوست خوبم حمیدرضا جان برای من ارسال کردن و من تصمیم گرفتم در چند قسمت این سوالات رو برای شما دوستان خوبم ترجمه کنم.

https://github.com/lydiahallie/javascript-questions

اگه مصاحبه‌ی یکی از شرکت‌های بزرگ (چه ایرانی و چه غیرایرانی) رو رفته باشین، از همین سوالات js core ای ازتون سوال میپرسن

پاسخ سوالات رو در انتهای مقاله نوشتم.

توی کامنت‌ها بهم بگین که اگه واستون مفید بوده ادامه سوالات رو ترجمه کنم یا چی؟

سوال اول: خروجی کد زیر بنظرتون کدوم گزینه میشه؟

https://gist.github.com/2012mjm/604fa78f29ca082b8a5c7a5da666c9a1
  • A: Lydia and undefined
  • B: Lydia and ReferenceError
  • C: ReferenceError and 21
  • D: undefined and ReferenceError

سوال دوم: خروجی این یکی کد کدوم گزینست ؟

https://gist.github.com/2012mjm/75267606418fb8b3a7b025a7a232f40a
  • A: 0 1 2 and 0 1 2
  • B: 0 1 2 and 3 3 3
  • C: 3 3 3 and 0 1 2

سوال سوم: بازم خروجی این یکی کد کدوم گزینست ؟

https://gist.github.com/2012mjm/7e238564c99c802f92e1b442fa927ef2
  • A: 20 and 62.83185307179586
  • B: 20 and NaN
  • C: 20 and 63
  • D: NaN and 63

سوال چهارم: خروجی چیه ؟

https://gist.github.com/2012mjm/9e2b758dd5562c9f2512297d490d1ffe
  • A: 1 and false
  • B: false and NaN
  • C: false and false

سوال پنجم: کدام یک از گزینه‌ها درست است؟

https://gist.github.com/2012mjm/9ddb0aea847098e6f02b7743ebfecb98
  • A: mouse.bird.size is not valid
  • B: mouse[bird.size] is not valid
  • C: mouse[bird["size"]] is not valid
  • D: All of them are valid

سوال ششم: خروجی کد زیر چی میشه؟

https://gist.github.com/2012mjm/32039598fc8e20f577f6395e3bb1890c
  • A: Hello
  • B: Hey!
  • C: undefined
  • D: ReferenceError
  • E: TypeError

سوال هفتم: خروجی کدومه؟

https://gist.github.com/2012mjm/66b4098ef63452d3f416b25887b0d335
  • A: true false true
  • B: false false true
  • C: true false false
  • D: false true true

سوال هشتم: خروجی ؟

https://gist.github.com/2012mjm/11c6161eec08b16a89a23682b70167b5
  • A: orange
  • B: purple
  • C: green
  • D: TypeError

سوال نهم: خروج؟

https://gist.github.com/2012mjm/3e14389cc0fcd94601dd5ea1738669a9
  • A: {}
  • B: ReferenceError: greetign is not defined
  • C: 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 هستند.)