در قسمت اول مقدمه ای بر عملگرها در جاوا اسکریپت به تشریح عملگرهای حسابی (Arithmetic)، عملگرهای تخصیص یا انتساب (Assignment)، و عملگرهای مقایسه ای (Comparison) پرداختم. در این پست و در ادامه مبحث عملگرها به عملگرهای منطقی (Logical) در جاوا اسکریپت خواهم پرداخت.
ازین نوع عملگرها که بسیار هم پرکاربرد هستند زمانی استفاده می کنیم که چند شرط مختلف وجود دارد و ما می خواهیم بر اساس ترکیب آن شرایط، تصمیم گیری های مختلفی داشته باشیم. در جاوا اسکریپت سه نوع عملگر منطقی داریم: عملگر منطقی AND، عملگر منطقی OR، و عملگر منطقی NOT. در ادامه به ترتیب به هر کدام ازین عملگرها خواهم پرداخت:
عملگر منطقی AND
این عملگر را با && نشان می دهند. نتیجه اعمال این عملگر زمانی دارای ارزش true خواهد بود که هر دو عملوندش دارای ارزش منطقی true باشند. مثال:
console.log(true && true); //true
اما اگر یکی از عملوندهایش دارای ارزش منطقی false باشد (فرقی ندارد کدامیک باشد چپ یا راست)، آنگاه مقدار بازگشتی این عملگر نیز دارای ارزش منطقی false خواهد بود. مثال:
console.log(false && true); //false console.log(true && false); //false
حالا حتما می پرسید کاربرد این عملگر در دنیای واقعی چیست؟
فرض کنید برنامه ای می خواهیم بنویسیم که بر اساس شرایط عمومی زیر، درخواست افراد برای اخذ وام را تایید یا رد می کند:
اگر شرایط فردی با هر دو شرط بالا منطبق باشد آنگاه واجد شرایط لازم برای اخذ وام خواهد بود و درخواستش برای دریافت وام مورد تایید قرار می گیرد و در غیر اینصورت واجد شرایط لازم برای اخذ وام نخواهد بود و با درخواستش نیز موافقت نخواهد شد.
یک پیاده سازی نوعی برای منطق این برنامه می تواند به صورت زیر باشد. ابتدا دو متغیر برای نگهداری مقدار دو شرط بالا تعریف می کنیم و آن ها را با یک مقدار پیش فرض مقدار دهی اولیه می کنیم:
let highIncome = true; let goodCreditScore = true;
حالا با استفاده از عملگر && و ترکیب شرایط بالا می توانیم بفهمیم که فرد واجد شرایط لازم برای اخذ وام هست یا خیر:
let eligibleForLoan = highIncome && goodCreditScore; console.log(eligibleForLoan); //true
عملگر منطقی OR
این عملگر را با || نشان می دهند. نتیجه اعمال این عملگر زمانی دارای ارزش true خواهد بود که حداقل یکی از دو عملوندش (فرقی ندارد کدامیک باشد چپ یا راست) دارای ارزش منطقی true باشند. همان مثال بالا را این بار با مقادیر اولیه متفاوت و نیز منطق متفاوت برای عملگر منطقی OR تکرار می کنیم به این معنی اگر فردی یکی از شرایط بالا را هم داشت بتواند وام بگیرد:
let highIncome = true; let goodCreditScore = false; let eligibleForLoan = highIncome || goodCreditScore; console.log(eligibleForLoan); //true
عملگر منطقی NOT
این عملگر را با ! نشان می دهند. عملگر منطقی NOT، ارزش منطقی عملوند مقابل خود را معکوس میکند. یعنی اگر مقدار عملوندش دارای ارزش منطقی true باشد، مقدار false را به عنوان نتیجه باز میگرداند و اگر مقدار عملوندش دارای ارزش منطقی false باشد، آنگاه مقدار true را باز خواهد گرداند.
متغیر دیگری به مثال بالا اضافه می کنیم تا نتیجه درخواست فرد برای اخذ وام را در آن ذخیره کنیم. سپس به کمک عملگر منطقی NOT آن را مقدار دهی می کنیم. بایستی کدمان را طوری بنویسیم که اگر فردی واجد شرایط لازم برای اخذ وام نبود آنگاه درخواستش رد شود:
در تمامی مثال هاییکه در بالا مشاهده نمودید، عملوندهاییکه به کار برده شده اند همگی از نوع Boolean (بولی) با مقادیر true یا false بودند. اما خوبست که بدانید ما می توانیم عملگرهای منطقی را علاوه بر مقادیر بولی بر روی مقادیر غیر بولی هم به کار ببریم.
مثال های زیر را مستقیما در کنسول مرورگرتان بنویسید و نتیجه را مشاهده کنید:
مطابق مثال های تصویر بالا ثابت می شود که:
نکته: نتیجه یک عبارت محاسباتی منطقی، لزوما یک مقدار بولی یعنی true یا false نیست و نتیجه کاملا بستگی به مقدار عملوندها دارد.
وقتی موتور جاوا اسکریپت اقدام به ارزیابی منطقی یک عبارت محاسباتی می کند، به عملوندها نگاه می کند اگر عملوندی از نوع Boolean نبود ابتدا آن عملوند را به یک مقدار معادل اصطلاحا Truthy (دارای ارزش درستی) یا Falsy (دارای ارزش نادرستی) تفسیر می کند. مفهوم مقدار Truthy با true، و مقدار Falsy با false متفاوت است.
برای شناختن مقادیر Truthy ابتدا باید مقادیر Falsy را بشناسیم. انواع مقادیر Falsy در زبان برنامه نویسی جاوا اسکریپت عبارتند از: undefined، null، 0، false، ' ' (رشته تهی)، و NaN
مقدار NaN یا Not-A-Number یک مقدار ویژه در جاوا اسکریپت است. از جمله مواردیکه نتیجه یک عبارت محاسباتی برابر با NaN می شود عبارتند از:
قانون بعدی عبارتست ازینکه هر چیزیکه مقدارش Falsy نیست پس حتما Truthy است. مثال زیر را در نظر بگیرید:
console.log(false || 'Ali');
مقدار Ali یک رشته غیر تهی است بنابراین مقدارش Falsy نیست و Truthy است. زمانیکه موتور جاوا اسکریپت این عبارت را ارزیابی می کند ابتدا به مقدار false برخورد می کند سپس ارزیابی را ادامه می دهد و با یک مقدار Truthy مواجه می شود چون عملگر این عبارت محاسباتی از نوع OR منطقی می باشد بلافاصله مقدار رشته ای Ali را به عنوان نتیجه ارزیابی باز می گرداند. در مورد مثال زیر هم به همین صورت است:
console.log(false || 1);
چون 1 مقدار عددی غیر صفر است بنابراین یک مقدار Truthy است و همان به عنوان نتیجه ارزیابی باز گردانده خواهد شد. اما در مورد مثال زیر چطور:
console.log(false || 1 || 2);
باز هم مقدار 1 به عنوان نتیجه ارزیابی بازگردانده خواهد شد. حتما می پرسید چرا؟ موتور جاوا اسکریپت ارزیابی را از اولین عملوند شروع می کند و به محض اینکه با اولین مقدار Truthy مواجه شود آن را به عنوان نتیجه ارزیابی باز خواهد گرداند و دیگر عملیات ارزیابی آن عبارت را ادامه نخواهد داد و در همان نقطه متوقف خواهد شد حتی اگر بعد از آن صدها عملوند دیگر هم وجود داشته باشد. به این ویژگی اصطلاحا اتصال کوتاه یا Short Circuting گفته می شود درست مشابه همان مفهوم اتصال کوتاه در مباحث الکتریسیته فیزیک.
حالا که نحوه کاکرد عملگرهای منطقی بر روی عملوندهایی با مقادیر Falsy و Truthy را درک کردید نوبت آنست که به یک مثال واقعی بپردازیم. فرض کنید در یک برنامه کاربر بایستی از بین رنگ ها، رنگ مورد نظرش را انتخاب کند در غیر اینصورت رنگ پیش فرض توسط برنامه برایش انتخاب خواهد شد شاید این رنگ، رنگ پیراهنی باشد که می خواهد خریداری کند. ابتدا متغیری برای ذخیره رنگ پیش فرض برنامه و متغیری برای ذخیره کردن رنگ انتخابی کاربر تعریف می کنیم:
let defaultColor = 'blue'; let userColor;
حالا برای پیاده سازی منطق برنامه می توانیم خیلی ساده از عملگر منطقی || به صورت زیر استفاده کنیم:
let currentColor = userColor || defaultColor; console.log(currentColor);
با اجرای کد فوق مقدار blue یا همان رنگ پیش فرض برنامه در خروجی نمایش داده خواهد شد چرا که کاربر رنگی را انتخاب نکرده است لذا مقدار متغیر userColor برابر با undefined است و چون undefined یک مقدار Falsy است و blue یک مقدار Truthy است بنابراین نتیجه، مقدار blue خواهد بود.
حالا اگر کاربر مثلا رنگ red را انتخاب کرده باشد، مقدار red در خروجی نمایش داده خواهد شد. چرا که اگر یادتان باشد گفتیم موتور جاوا اسکریپت به محض دیدن اولین مقدار Truthy، ارزیابی را متوقف کرده و همان مقدار را به عنوان نتیجه باز خواهد گرداند. البته در نظر داشته باشید برای دستیابی به این نتیجه، بسیار مهم است که حتما متغیر userColor اولین عملوند عبارت باشد در غیر اینصورت همیشه مقدار رنگ پیش فرض برنامه انتخاب خواهد شد.
آنچه که در مثال بالا دیدید قدرت عملگرهای منطقی را نشان می دهد. بنابراین به یاد داشته باشید که از عملگرهای منطقی معمولا برای تعیین مقادیر پیش فرض متغیرها، استفاده می شود.