مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

در مصاحبه استخدام جاوا اسکریپت از شما چه سوالاتی می شود؟

برنامه نویسی و طراحی وب یکی از شغل هایی است که مصاحبه های آنها می تواند بسیار چالش برانگیز باشد و شاید خیلی از کسانی که قصد دارند در جایی برای این شغل ها استخدام شوند نگران مصاحبه سوال های آن باشند. در این مطلب یک سری سوالات مهم از زبان محبوب Javascript که بسیار در مصاحبه ها تکرار شده است را آورده ایم تا با مطالعه آنها هم خودتان را محک بزنید و اگر با سوالات مصاحبه آشنایی ندارید تا حدودی با سوالات آشنا شوید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

در دوره آموزش جاوا ( آموزش برنامه نویسی جاوا ) این موارد بصورت رایگان آموزش داده شده است

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

در مصاحبه استخدام جاوا اسکریپت از شما چه سوالاتی می شود؟

مهمترین سوالات جاوا اسکریپت در مصاحبه های استخدام

1. چه ویژگی هایی در نسخه Es6 اضافه شده اند؟

همانطور که می دانید نسخه es6 جاوا اسکریپت که در سال 2015 معرفی شد قابلیت های فراوانی به این زبان اضافه کرد که باعث شد محبوبیت این زبان بسیار بیشترشود و بیشتر از قبل مورد استفاده باشد. مواردی که در این نسخه به این زبان اضافه شده است عبارتند از:

  • کلمات کلیدی let , const
  • مفهوم arrow function ها (توابع فلشی یا پیکانی)
  • رشته های چند خطی
  • مفهوم انتساب تخریبی (Destructuring assignment)
  • عملگر های rest, spread
  • مفهوم promise

2. فرق بین کلمات var, const, let چیست؟

متغیر هایی که با استفاده از let, const تعریف می شوند block-scoped هستند یعنی فقط در همان بلوکی که تعریف شده اند قابل دسترسی هستند. اما متغیر هایی که با استفاده از var تعریف شده اند یا globally-scoped (سراسری) هستند یا function-scoped یعنی یا به صورت سراسری قابل دسترس هستند یا اگر در بدنه تابع تعریف شوند در کل تابع قابلیت دسترسی دارند.
متغیر هایی که با var تعریف شده اند در داخل scope خودشان (چه سراسری چه تابعی)  می توانند آپدیت شوند و یا حتی دوباره تعریف شوند. اما متغیرهای تعریف شده با let فقط می توانند آپدیت شوند و نمی توان آنها را در داخل scope خودشان دوباره تعریف کرد. متغیر ها یا بهتر بگوییم ثابت هایی که با const تعریف شده باشند نه می توانند دوباره تعریف شوند و نه می توان آنها را تغییر داد (آپدیت نمی شوند).
متغیر های var را می توان قبل از این که آنها را تعریف کرد از آنها استفاده کرد و چون موقع استفاده هنوز تعریف نشده اند مقدار آنها undefined خواهد بود ولی اگر شما متغیر های let, const را استفاده کنید خطای Reference error دریافت خواهید کرد.
متغیر های let, var را می توان هنگام تعریف کردن مقداردهی نکرد و بعدا آنها را مقداردهی کرد ولی ثابت ها را که با const تعریف می کنیم باید هنگام تعریف کردن مقدار آنها را نیز مشخص کنیم.

3.معنی و مفهوم promise, async-await چیست؟

در واقع promiseها راهی برای برنامه نویسی asynchronous در جاوا اسکریپت است. یعنی شما یک عملیات غیرهمگام (asynchronous) را صدا می زنید. نتیجه این عملیات می تواند موفقیت آمیز باشد یا شکست بخورد. از آنجایی که اجرای این عملیات ممکن است زمان بر باشد و همان لحظه امکان اعلام پاسخ نهایی نباشد به شما یک شی promise داده می شود. شما می توانید هم برای زمانی که این promise موفقیت آمیز بود عملیاتی تعریف کنید و هم برای زمانی که عملیات شکست خورد. یعنی برای هر دو حالت callback تعریف می کنیم و هر وقت که نتیجه مشخص شد یکی از callback ها اجرا می شود. 
کلمات async, await هم یک راه دیگر برای برنامه نویسی asynchronous می باشد. استفاده از async, await سینتکس ساده تری دارد و همچنین شما را از افتادن در جهنم callback ها حفظ می کند.

4. چرا جاوا اسکریپت تک نخی (single-thread) است؟

یکی از دلایلی که جاوا اسکریپت single-thread است سادگی است. برای این که با پیچیدگی ها و خطاهایی که multi-threading دارد درگیر نشویم این زبان به صورت تک نخی پیاده سازی شده است. از طرفی دیگر با استفاده از همین تک نخی می توانیم از مفاهیم promise, async استفاده کنیم.

5.مفهوم callback چیست و چگونه کار می کند؟

تابعی که به عنوان ورودی به یک تابع دیگر داده می شود را callback می گویند که تابع دریافت کننده هر وقت که بخواهد می تواند callback را اجرا کند. وقتی که یک عملیات asynchronous یا عملیات IO می خواهد اجرا شود خود thread اصلی آن را اجرا نمی کند و آن را در یک صف اجرا که مخصوص این کار است قرار می دهد وقتی که اجرای آن تمام شد با اجرا کردن callback آن نتیجه را به برنامه اصلی بر می گرداند.

6.چند راه برای تعریف تابع وجود دارد؟

1. تعریف تابع با استفاده از کلمه کلیدی function که بعد از آن یک نام برای تابع تعریف می کنیم و لیست پارامتر ها در داخل پرانتز در ادامه آن می آید. مانند کد زیر

function functionName(parameters){}

2. استفاده از روش تعریف تابع کوتاه که در نسخه es2015 معرفی شده است که داخل یک شی یا کلاس می توان از آن استفاده کرد که به شکل زیر است.

const obj = {
  foo() {
    return 'bar';
  }
};

console.log(obj.foo());
// expected output: "bar"

3.استفاده از arrow function ها: این روش به این شکل است که لیست پارامترها در بین دو پرانتز قرار داده می شود و بعد از از علامت فلش یا پیکان استفاده می شود مانند کد زیر

const functionName=(parameters)=>{}

4.استفاده از Function constructor که این روش به خاطر مشکلات امنیتی و پرفورمنسی توصیه نمی شود.

7.خروجی کد زیر چیست؟

x = 5;
var x;
(function fun() { 
    {
        let x = 1;
        x++;
        console.log(x);
    }
    console.log(x);
})();

خروجی این کد به شکل زیر خواهد بود

2

5

دلیل این خروجی هم این است که برای تعریف x داخلی از let استفاده شده است که باعث می شود این متغیر فقط در همان بلوک قابل دسترسی باشد و همانطور که گفتیم می توان متغیر var را قبل از این که تعریف کنیم استفاده کنیم.

8.خروجی کد زیر چه چیزی خواهد بود؟

setTimeout(() => {
    console.log("Hi");
}, 0)
console.log("Hello");

خروجی کد بالا به شکل زیر خواهد بود

// output
Hello 
Hi

همچنین خروجی کد زیر را تعیین کنید.

var x = 5;
x = 0;
setTimeout(() => {
    console.log(x);
})
console.log("Hello");
x = x+1;

خروجی کد بالا به شکل زیر خواهد بود

// output
Hello
1

دلیل این خروجی این است که تابعی که به setTimeout داده می شود یک callback است که به صف اجرای callback ها قرار می گیرد که معمولا callback ها با کمی تاخیر بعد از بدنه اصلی و کد اصلی برنامه اجرا می شوند.

9. خروجی کد زیر چیست؟

fun2();
console.log(x);
console.log(y);
fun1();
const fun1 = () => {
    console.log("fun1")
}
function fun2(){
    console.log("fun2")
}
var x = 5;
let y = 7;

خروجی کد بالا به شکل زیر خواهد بود:

// output 
fun2
undefined
ReferenceError: Cannot access 'y' before initialisation
ReferenceError: Cannot access 'fun1' before initialisation

دلیل این خروجی ها هم همانطور که گفتیم در تفاوت بین متغیر های تعریف شده با var  و متغیر هایی که با let, const تعریف می شوند. در تعریف متغیر با var می توان از متغیر قبل از مقداردهی استفاده کرد ولی وقتی از let, const استفاده می کنیم این امکان وجود ندارد و خطا دریافت خواهیم کرد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات