درآمدی بر برخی فیچرهای کمتر شناخته‌شدهٔ جاوااسکریپت


جاوااسکریپت زبانی است که یادگیری آن در سطوح ابتدایی آسان است اما عمیق شدن در آن کمی دشوار به نظر می‌رسد چرا که یکسری قابلیت‌ها و سینتکس‌های پیچیده‌ای دارا است به طوری که یک دولوپر باتجربه پس از سال‌ها کدنویسی با این زبان نیز نمی‌تواند ادعای آشنایی با زیروبم جاوااسکریپت را داشته باشد! در همین راستا، در این مقاله قصد داریم تا برخی از فیچرهای این زبان را بیان کنیم که ممکن است دولوپرهای تازه‌کار با آن‌ها ناآشنا باشند.

اپراتور void
یک اپراتور به اصطلاح Unary (تک‌منظوره) است که تنها برای اجرای دستور مد نظر بدون ریترن کردن مقداری از آن به کار گرفته می‌شود و مقدار undefined را در خروجی ریترن می‌کند برای مثال کدهای زیر را در نظر بگیرید:

void 0
void (0)

هر دو دستور فوق معادل یکدیگر بوده و مقادیر ریترن‌شده برای هر یک از آن‌ها خروجی undefined خواهد بود که به منزلۀ دستور دادن به مرورگر برای انجام ندادن کاری مورد استفاده قرار می‌گیرند. به عنوان مثالی دیگر داریم:

void(1 === 1);
void anyFunction();

در کد بالا دستور سطر اول یک مقایسۀ درست می‌باشد که دو عدد از نظر مقدار و نوع با هم برابر بوده و باید مقدار true در خروجی ریترن شود اما به دلیل استفاده از اپراتور void مقداری مبنی بر درست بودن این مقایسه در خروجی ریترن نخواهد شد. همان‌طور که در خط دوم مشاهده می‌شود، استفاده از این کیورد برای تعریف فانکشن‌ها نیز منجر بدین خواهد شد تا فانکشن مد نظر اجرا شده اما مقداری را در خروجی ریترن نکند (برای آشنایی با سایر اپراتورهای این زبان به مقالۀ درآمدی بر اپراتورها در زبان جاوااسکریپت مراجعه نمایید.)

اختیاری بودن پرانتز برای ساخت Object
پرانتزهایی که بعد از نام کلاس جهت ساخت یک آبجکت جدید می‌آوریم اختیاری هستند که بدین طریق در هنگام فراخوانی کانستراکتور می‌توانیم از پاس دادن آرگومان ورودی به آن خودداری کنیم. در همین راستا در ادامه سه نمونه کد معتبر در این زبان را هم با استفاده از پرانتز و هم بدون استفاده از آن آورده‌ایم:

const date = new Date();
const month = new Date().getMonth();
const myInstance = new MyClass();

همان‌طور که در کد فوق می‌بینید سه نمونه آبجکت ساخته‌ایم که در هر یک از آن‌ها نیز علائم () را به کار برده‌ایم اما در عین حال امکان تغییر دستورهای فوق‌الذکر را به صورت زیر داریم:

const date = new Date;
const month = (new Date).getMonth();
const myInstance = new MyClass;

هر یک از این دستورها نیز در زبان جاوااسکریپت معتبر بوده و به منزلۀ ساخت آبجکت جدید از کلاس‌های مد نظر هستند که البته وقتی علائم () درج نشوند نمی‌توان آرگومانی را به عنوان ورودی به کانستراکتور فراخوانی‌شده از کلاس مد نظر پاس داد.

عدم استفاده از پرانتز برای تعریف IIFE
IIFE مخفف عبارت Immediately Invoked Functional Expression بوده و به فانکشن‌هایی اشاره دارد که به صورت بی‌نام تعریف شده و به محض تعریف نیز اجرا می‌شوند که می‌توانیم آن‌ها را بدون پرانتزهای ابتدایی نیز تعریف کنیم. در ادامه، نمونه‌ای از سینتکس معتبر پیاده‌سازی یک به اصطلاح IIFE را آورده‌ایم:

(function (){
    console.log('Normal IIFE called')
}
)()

در کد فوق با استفاده از پرانتزهای ابتدایی به مفسر جاوااسکریپت گفته‌ایم که اسکریپت مد نظر یک دستور فانکشنال است و تحت هیچ عنوان فانکشنی نیست تا به محض تعریف اجرا گردد و در ادامه با به‌کارگیری کیورد function یک فانکشن بی‌نام تعریف کرده و گفته‌ایم در صورت اجرا، استرینگ «Normal IIFE called» در خروجی چاپ شود. حال اگر بخواهیم فانکشن بی‌نام فوق را بدون استفاده از پرانتزهای ابتدایی تعریف کنیم، خواهیم داشت:

void function (){
    console.log('Normal IIFE called')
}()

در کد فوق با حذف پرانتزهای ابتدایی، اپراتور void را برای تعریف فانکشن بی‌نام به کار گرفته‌ایم و بدین وسیله به مفسر جاوااسکریپت دستور می‌دهیم که کد مد نظر یک دستور فانکشنال است و به محض تعریف باید اجرا شود و از همین روی می‌توانیم از آوردن () در ابتدا خودداری کنیم اما همان‌طور که کمی قبل‌تر بیان کردیم، اپراتور void منجر بدین می‌شود که فانکشن بی‌نام فوق‌الذکر مقداری را در خروجی ریترن نکند که در صورت نیاز به ریترن شدن نتیجه می‌توان به جای استفاده از اپراتور void فانکشن مذکور را به یک متغیر دلخواه منتسب کرد که بدین ترتیب دیگر نیازی به آوردن پرانتزهای ابتدایی نخواهد بود و نتیجۀ حاصل از اجرای فانکشن در متغیر مذکور نگاه‌داری شده و می‌توانیم در صورت نیاز آن را مورد استفاده قرار دهیم که برای این منظور کدهای فوق را به صورت زیر ریفکتور کرده‌ایم:

result = (function () {
    return 'SokanAcademy.com'
})()

در کد فوق متغیری تحت عنوان result تعریف کرده و فانکشن بی‌نامی را به روش متداول و با استفاده از پرانتزهای ابتدایی تعریف کرده‌ایم که این وظیفه را دارا است تا استرینگ «SokanAcademy.com» را در خروجی ریترن کند و نتیجۀ حاصل از اجرای این فانکشن در متغیر result نگاه‌داری می‌شود اما اگر بخواهیم فانکشن بی‌نام فوق را بدون ذکر پرانتزهای ابتدایی تعریف کنیم، خواهیم داشت:

result = function () {
    return 'SokanAcademy.com'
}()

مجدداً در کد فوق فانکشن بی‌نام مد نظر را به متغیری تحت عنوان result منتسب کرده‌ایم که بدین ترتیب می‌توانیم از آوردن پرانتزهای ابتدایی برای تعریف فانکشن به اصطلاح IIFE خودداری کنیم و در نتیجۀ اجرای دستور فوق استرینگ زیر در خروجی ریترن خواهد شد:

SokanAcademy.com

استرینگ بالا نتیجۀ حاصل از اجرای دستور فانکشنال فوق‌الذکر بوده و در متغیر result نگاه‌داری می‌شود.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

جمع‌بندی
در این مقاله به بیان برخی از فیچرهای زبان برنامه‌نویسی جاوااسکریپت و بررسی کاربردهای آن‌ها پرداختیم که مسلماً بخش کوچکی از قابلیت‌های این زبان انعطاف‌پذیر را شامل می‌شود. همچنین در صورت تمایل به آشنایی با دیگر مقالات مرتبط با این زبان می‌توانید با دنبال کردن تگ #جاوااسکریپت به اطلاعات بیشتری دست یابید.

منبع