قصد داریم طی چند پست، بصورت کاملا گسترده به سوالاتی که در یک مصاحبه جاوا اسکریپت انجام میشه بپردازیم. در آخر هم بهترین وبسایتها برای کسانی که دنبال اپلای کردن هستن هم پیشنهاد میدم.
راههای زیادی برای ایجاد ابجکت در جاوا اسکریپت وجود دارد.
ساده ترین راه برای ایجاد یک ابجکت خالی استفاده از سازنده Object است. که اصلا این روش توصیه نمی شود:
var object = new Object();
بهترین روش استفاده از متد create Object است که با پاس دادن یک prototype به عنوان پارامتر، یک ابجکت جدید ایجاد می کند:
var object = Object.create(null);
زنجیره اولیه برای ساخت انواع جدیدی از اشیاء بر اساس موارد موجود استفاده می شود. این شبیه به ارث بری در یک زبان مبتنی بر کلاس است.
نمونه اولیه در نمونه شی از طریق Object.getPrototypeOf(object) یا ویژگی __proto__ در دسترس است در حالی که نمونه اولیه در تابع سازنده از طریق Object.prototype در دسترس است.
این متدها به کلیدواژه this وابسته هستند.
در متد apply آرگومانها بصورت یک آرایه پاس میدهیم:
myMath.add.apply(item1, [3, 2, 1]);
در متد call بصورت جدا جدا و تک تک پاس میدهیم:
myMath.add.call(item1, 3, 2, 1);
متد bind یک تابع رو برمیگردونه که وقتی صدا زده میشود، مقدار this در تابع به آبجکت دلخواه ما اشاره میکند و به این بستگی ندارد که این تابع چطوری و کجا دارد صدا زده میشود:
var employee1 = { firstName: "John", lastName: "Rodson" }; var employee2 = { firstName: "Jimmy", lastName: "Baily" }; function invite(greeting1, greeting2) { console.log( greeting1 + " " + this.firstName + " " + this.lastName + ", " + greeting2 ); } var inviteEmployee1 = invite.bind(employee1); var inviteEmployee2 = invite.bind(employee2); inviteEmployee1("Hello", "How are you?"); // Hello John Rodson, How are you? inviteEmployee2("Hello", "How are you?"); // Hello Jimmy Baily, How are you?
با استفاده از متد slice عناصر انتخاب شده را در یک آرایه به عنوان یک ابجکت آرایه جدید برمیگردانیم:
let arrayIntegers = [1, 2, 3, 4, 5]; let arrayIntegers1 = arrayIntegers.slice(0, 2); // returns [1,2] let arrayIntegers2 = arrayIntegers.slice(2, 3); // returns [3] let arrayIntegers3 = arrayIntegers.slice(4); //returns [5]
از متد splice استفاده میشود. این متد عناصری که از آرایه اصلی حذف میشود را به عنوان خروجی بر میگرداند و آرایه اصلی را اصلاح می کند:
let arrayIntegersOriginal1 = [1, 2, 3, 4, 5]; let arrayIntegers1 = arrayIntegersOriginal1.splice(0, 2); // returns [1, 2]; original array: [3, 4, 5]
متد slice آرایه اصلی را تغییر نمیدهد ولی splice آرایه اصلی را تغییر میدهد.
متد slice زیر مجموعه آرایه اصلی را برمیگرداند ولی splice عناصر حذف شده را به صورت آرایه برمیگرداند.
متد slice برای انتخاب عناصر استفاده میشود ولی splice برای اضافه کردن یا حذف عناصر استفاده میشود.
دو رشته زمانی کاملاً برابر هستند که توالی کاراکترهای یکسان، طول یکسان و کاراکترهای مشابه در موقعیتهای متناظر داشته باشند.
انواع Null و Undefined با === برابر نیستند، بلکه برابر با == هستند. یعنی
null === undefined // false null == undefined // true 1 == "1" // true 1 === "1" // false
توابع کلاس یک به این معنی است که با توابع مانند هر متغیر دیگری رفتار می شود. یعنی یک تابع میتونه به عنوان یک آرگومان به توابع دیگر ارسال شود یا میتونه توسط تابع دیگری برگردونده شود و یا میتواند به عنوان یک مقدار به یک متغیر نسبت داده شود:
const handler = () => console.log("This is a click handler function"); document.addEventListener("click", handler);
تابع Higher-Order تابعی است که تابع دیگری را به عنوان آرگومان میپذیرد یا تابعی را به عنوان مقدار بازگشتی یا هر دو را برمیگردونند:
const firstOrderFunc = () => console.log("Hello, I am a First order function"); const higherOrder = (ReturnFirstOrderFunc) => ReturnFirstOrderFunc(); higherOrder(firstOrderFunc);
تابعی که فقط یک ورودی میگیرد و یک مقدار به عنوان خروجی بر میگرداند:
const unaryFunction = (a) => console.log(a + 10); // Add 10 to the given argument and display the value
دستور let یک متغیر محلی block scope را اعلام میکند. بنابراین متغیرهای تعریف شده با کلمه کلیدی let به بلوک، عبارت یا عبارتی که در آن استفاده میشود محدود میشود:
let counter = 30; if (counter === 30) { let counter = 31; console.log(counter); // 31 } console.log(counter); // 30 (because the variable in if block won't exist here)
در حالی که متغیرهای اعلام شده با کلمه کلیدی var برای تعریف یک متغیر به صورت سراسری یا به صورت محلی برای کل یک تابع بدون توجه به محدوده بلوک استفاده میشود.
متغیرهایی که با let تعریف شدهاند این اجازه را میدهد که به یک محدوده بلوک از کد، مثل یک حلقه for، محدود باشد و خارج از محدوده بلوک تعریف نشده باشد. دقیقا برخلاف var، متغیری که با var تعریف شده باشد، بدون در نظر گرفتن محدوده یک بلوک، در تمام کد قابل دسترس و global است.
تابع encodeURI برای رمزگذاری URL استفاده میشود. این تابع به یک رشته URL به عنوان پارامتر نیاز دارد و رشته رمزگذاری شده را برمیگرداند.
تابع decodeURI برای رمزگشایی یک URL استفاده می شود. این تابع به یک رشته URL رمزگذاری شده به عنوان پارامتر و برگرداندن آن رمزگشایی شده نیاز دارد:
let uri = "employeeDetails?name=john&occupation=manager" let encoded_uri = encodeURI(uri); let decoded_uri = decodeURI(encoded_uri);
اگر میخواهیم کاراکترهایی مانند / ? : @ & = + $ # را رمزگذاری کنیم، باید از تابع encodeURIcomponent استفاده کنیم.
مفهوم Hoisting یک مکانیسم جاوا اسکریپت است که در آن متغیرها، اعلانهای تابع و کلاسها قبل از مرحله اجرا در حافظه ذخیره میشوند:
console.log(message); //output : undefined var message = "The variable Has been hoisted"
کد بالا برای مفسر مانند زیر است:
message("Good morning"); //Good morning function message(name) { console.log(name); }
این Hoisting باعث میشود که توابع قبل از اعلام به صورت ایمن در کد مورد استفاده قرار گیرند.
شی در جاوا اسکریپت خصوصیتها و متدهایی را از شی نمونه اولیه یا prototype خود به ارث میبرد.
وراثت مبتنی بر prototype در تابع به صورت زیر نوشته میشه:
function Bike(model, color) { this.model = model; this.color = color; } Bike.prototype.getDetails = function () { return this.model + " bike has" + this.color + " color" };
در حالی که کلاس های ES6 را می توان به عنوان یک جایگزین تعریف کرد:
class Bike { constructor(color, model) { this.color = color; this.model = model; } getDetails() { return this.model + " bike has" + this.color + " color" } }
زمانی که کد ما بزرگتر و بزرگتر میشود، مجبور میشویم این برنامه را به فایلهای مختلفی تقسیم کنیم. به هر کدام از این فایل ها یک ماژول میگن چرا که قطعهای از کد ما را درون خودشان دارند.
مجموعهای از قواعد است که مشخص میکند چگونه میتوانیم به متغیرها با استفاده از نامشان دسترسی داشته باشیم و در چه جاهایی به آنها اجازه دسترسی داریم و میتوانیم از آنها استفاده کنیم.
یک اسکریپت یا یک فایل که در پسزمینه اجرا میشود، جدا از یک صفحه وب و ویژگیهایی را ارائه میدهد که نیازی به صفحه وب یا تعامل کاربر ندارد. توسعه آفلاین اولین برنامه وب، همگامسازی در پسزمینه، اعلانها، رهگیری و رسیدگی به درخواستهای شبکهها وظیفهی آن است.
سرویس ورکر نمیتواند مستقیماً به DOM دسترسی داشته باشد. اما میتواند با پاسخ دادن به درخواستهای ارسال شده از طریق postMessage با صفحاتی که کنترل میکند ارتباط برقرار کند و آن صفحات میتوانند DOM را دستکاری کنند.