گاهی ما نیاز داریم تا تحت شرایط مختلف کار های مختلفی انجام دهیم که برای انجام این کار در این مقاله از وبسایت ecmascript.ir به موضوع عملگر های شرطی می پردازیم و این مفاهیم را توضیح می دهیم.
برای ایجاد شرط های مختلف می توانیم از عملگر علامت سوال ?
یا کلمه ی if
استفاده کنیم.
عبارت if
عملگر if (...)
یک شرط را که درون پرانتز نوشته می شود بررسی می کند و اگر حاصل true
بود، مجموعه ای از کدها را اجرا می کند.
برای مثال:
let year = prompt('در چه سالی استاندارد اکمااسکریپت منتشر شد؟', '');
if (year == 2015) alert( 'احسنت! ?' );
در مثال بالا، شرطی که درون پرانتز نوشته ایم یک بررسی برابری ساده (year == 2015
) است. اما شرط هایی به مراتب پیچیده تر از این هم می توانیم بنویسیم.
اگر بخواهیم بیش از یک statement بنویسیم، باید کد های خود را میان {...}
قرار دهیم:
if (year == 2015) {
alert( 'احسنت! ?' );
alert( 'بابا باهوش!' );
}
توصیه می کنیم که همواره کدهای خود را میان {...}
قرار دهید، حتی اگر می خواهید تنها یک statement بنویسید. انجام این کار باعث افزایش خوانایی کدهای شما می شود.
تبدیل به بولین
دستور if (...)
شرط بین پرانتز را بررسی می کند و حاصل این شرط را به بولین تبدیل می کند.
بیایید قواعد تبدیل یک مقدار به بولین را از مطلب تبدیل دیتاتایپ مرور کنیم:
- عدد
۰
، رشته ی خالی""
،null
،undefined
وNaN
همگی بهfalse
تبدیل می شوند. به همین علت این مقادیرfalsy
نامیده می شوند. - بقیه ی مقادیر چه رشته باشند یا عدد به
true
تبدیل می شوند. به همین علتtruthy
نامیده می شوند.
بنابر این کدی با شرط زیر هرگز اجرا نمی شود:
if (0) { // 0 جز مقادیر falsy است
...
}
… و تحت شرایط زیر کد همیشه اجرا می شود:
if (1) { // عدد ۱ جز مقادیر truthy است
...
}
ما می توانیم یک مقدار بولین را که از پیش محاسبه کرده ایم به عنوان شرط پاس بدهیم:
let cond = (year == 2015); // این خط بررسی می کند که حاصل true می شود یا false
if (cond) {
...
}
عبارت “else”
دستور شرطی if
می تواند شامل یک بلوک اختیاری به نام else
باشد. هرگاه جواب شرطی که نوشته ایم false
شود، کد های درون بلوک else
اجرا می شوند.
برای نمونه:
let year = prompt('در چه سالی استاندارد اکمااسکریپت منتشر شد؟', '');
if (year == 2015) {
alert( 'شما درست حدس زدید!' );
} else {
alert( 'غلطه آی غلطه! ?' ); // هر مقداری پاسخی بجز ۲۰۱۵ این خط را اجرا می کند
}
چندتا شرط: “else if”
گاهی ما نیاز داریم تا چند تا شرط مختلف را بررسی کنیم. عبارت else if
امکان این کار را برای ما فراهم می کند.
برای مثال:
let year = prompt('در چه سالی استاندارد اکمااسکریپت منتشر شد؟', '');
if (year < 2015) {
alert( 'خیلی کم گفتی! ?' );
} else if (year > 2015) {
alert( 'زیاده بابا! ?' );
} else {
alert( 'ایول! ?' );
}
در اسکریپت های بالا، جاوااسکریپت ابتدا شرط year < 2015
را بررسی می کند. اگر حاصل falsy
بود، به سراغ شرط بعدی می رود year > 2015
. اگر این شرط هم falsy
بود، بلوک else
را اجرا می کند.
می توانیم به هر تعداد که نیاز داریم از else if
استفاده کنیم. عبارت else
هم اختیاری است.
عملگر شرطی «علامت سؤال» (?
)
گاهی می خواهیم بر اساس یک شرط، مقداری را درون یک متغیر بریزیم.
مثلاً:
let accessAllowed;
let age = prompt('چند سال دارید؟', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
alert(accessAllowed);
عملگر علامت سوال ؟
این امکان را فراهم می کند که مراحل بالا را به شکل کوتاه تری بنویسیم. این شیوهی نوشتن شرط ternary
نام دارد، چون کلمهی ternary به معنای سهتایی است و این عملگر تنها عملگری است که سه عملوند دارد. در جاوااسکریپت این عملگر تنها عملگری است که این تعداد عملوند را دارد.
سینتکس آن به شکل زیر است:
let result = condition ? value1 : value2;
شرط بررسی می شود: اگر true بود آنگاه value1
برگردانده می شود، در غیر این صورت value2
.
برای مثال:
let accessAllowed = (age > 18) ? true : false;
از نظر فنی می توانیم پرانتز های دور شرط age > 18
را در ternary حذف کنیم. اگر آن را ننویسیم هم مشکلی ایجاد نمی شود.
این مثال هم همان کاری را انجام می دهد که مثال قبلی انجام میداد:
// شرط age > 18 ابتدا بررسی می شود
// (نیازی نیست آن را درون پرانتز قرار دهیم)
let accessAllowed = age > 18 ? true : false;
اما پرانتز کد را خواناتر میکند. بنابر این همیشه استفاده از پرانتز را توصیه می کنیم.
به یاد داشته باشید
در مثال بالا، می توانستیم از نوشتن true و false صرف نظر کنیم زیرا خود مقایسه همیشه true
یا false
برمیگرداند.
// این کد همان کار مثال قبلی را انجام می دهد.
let accessAllowed = age > 18;
چندتا علامت سؤال
با کمک دنبالهای از عملگرهای ? میتوانیم مقداری را برگردانیم که به بیش از یک شرط وابسته است.
let age = prompt('چند سالته؟', ۱۸);
let message = (age < 3) ? 'سلام کوچولو موچولو!' :
(age < 18) ? 'سلام بچه زرنگ!' :
(age < 100) ? 'با عرض سلام و احترام!' :
'مگه میشه؟ مگه داریم؟!';
alert( message );
شاید در لحظه اوّل وحشت کنید که چی نوشتیم، ولی اگر یه خورده دقیقتر نگاهش کنید میبینید که در اصل دنبالهای از این شرط هاست:
- علامت سؤال اوّل شرط
age < 3
را بررسی میکند. - اگر نتیجه
true
باشد، رشتهی «سلام کوچولو موچولو!» را بر میگرداند، در غیر این صورت عبارت بعد از «:
» را بررسی می کند، یعنیage < 18
را. - اگر نتیجه
true
باشد رشتهی «سلام بچه زرنگ!» را بر میگرداند، در غیر این صورت عبارت بعد از «:
» بعدی را بررسی میکند، یعنیage < 100
را. - اگر نتیجه
true
باشد رشتهی «با عرض سلام و احترام!» را بر میگرداند، در غیر این صورت عبارت بعد از آخرین «:
» را بررسی میکند، یعنی رشتهی «مگه میشه؟ مگه داریم؟!» را بر میگرداند.
اگر میخواستیم همین دستور را با if
بنویسیم این شکلی میشد:
if (age < 3) {
message = 'سلام کوچولو موچولو!';
} else if (age < 18) {
message = 'سلام بچه زرنگ!';
} else if (age < 100) {
message = 'با عرض سلام و احترام!';
} else {
message = 'مگه میشه؟ مگه داریم؟!';
}
استفادهی نامتعارف از علامت سؤال «?»
گاهی اوقات بعضیها از ?
به جای if
استفاده میکنند:
let company = prompt('جاوااسکریپت را کدام شرکت ساخت؟', '');
(company == 'نت اسکیپ') ?
alert('ایول!') : alert('غلطه متأسفانه!');
در این جا بر اساس شرط company == 'نت اسکیپ'
، یکی از دو عبارت بعد از ?
اجرا میشود و alert میشود.
نکتهی این مثال در این است که ما مقدار برگشتی را در متغیّری نریختیم، بلکه نسبت به نتیجهی شرط ، کد متفاوتی را اجرا کرده ایم.
اصلاً خوب نیست که از عملگر علامت سؤال به این شکل استفاده کنیم.
درست است که این روش خلاصهتر از if
است، و به همین دلیل بعضیها به همین دلیل از این روش استفاده میکنند، ولی این باعث ناخوانا شدن کد خواهد شد.
اگر مثال بالا را با if
بازنویسی کنیم این طور میشود:
let company = prompt('جاوااسکریپت را کدام شرکت ساخت؟', '');
if (company == 'نت اسکیپ') {
alert('ایول!');
} else {
alert('غلطه متأسفانه!');
}
چشم انسان کدها را به صورت عمودی دنبال میکند. بلوکهی کدی که در چند خط پخش شود راحتتر خوانده میشود تا مجموعهدستوراتی که همه در یک خط افقی نوشته میشوند.
هدف عملگر ?
فقط این است که نسبت به نتیجهی شرط یک مقدار متفاوتی را برگرداند. لطفاً فقط برای همین کار از ?
استفاده کنید. اگر میخواهید نسبت به نتیجهی شرط کد مختلفی را اجرا کنید از همان if
استفاده کنید.