چهار عملگر منطقی در جاوااسکریپت وجود دارد: ||
(OR)، &&
(AND)، !
(NOT)، ??
(Nullish Coalescing). اینجا ما سه تای اول را پوشش می دهیم، عملگر ??
در مقاله بعدی است.
با اینکه آنها “منطقی” نام برده می شوند، می توانند روی هر نوع مقداری اعمال شوند، نه فقط نوع boolean. نتیجه آنها هم می تواند از هر نوعی باشد.
بیایید جزییات را ببینیم.
|| (OR)
عملگر “OR(یا)” با نماد دو خط عمود نمایش داده می شود:
result = a || b;
در برنامه نویسی کلاسیک، عملگر منطقی OR تنها با مقدارهای boolean کار می کرد. اگر هر کدام از آرگومان های آن true
باشد، ture
بر می گرداند، در غیر این صورت false
بر می گرداند.
در جاوااسکریپت، این عملگر مقداری فوت و فن و قدرت بیشتری دارد. اما اول، بیایید ببینیم با مقدارهای boolean چه اتفاقی می افتد.
چهار ترکیب احتمالی منطقی وجود دارد:
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
همانطور که می بینیم، نتیجه همیشه true
است به جز موقعی که هر دو عملوند false
باشند.
اگر یک عملوند boolean نباشد، برای ارزیابی به boolean تبدیل می شود.
برای مثال، با عدد 1
مانند true
رفتار می شود، با عدد 0
مانند false
:
if (1 || 0) { // همانند if( true || false ) کار میکند
alert( 'truthy!' );
}
اکثر اوقات، OR ||
به عنوان یک دستور if
استفاده می شود تا بررسی شود که آیا هر کدام از شرط های داده شده true
هست یا نه.
برای مثال:
let hour = 9;
if (hour < 10 || hour > 18) {
alert( 'اداره بسته است.' );
}
ما می توانیم شرط های بیشتری قرار بدهیم:
let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
alert( 'اداره بسته است.' ); // آخر هفته است
}
OR "||" اولین مقدار truthy را پیدا می کند
منطقی که بالا توصیف شد تا حدی کلاسیک است. الان، بیایید وارد ویژگی های “اضافه” جاوااسکریپت شویم.
الگوریتم قابل تعمیم به صورت زیر عمل می کند.
چند مقدار همراه با OR وارد می کنیم:
result = value1 || value2 || value3;
عملگر OR ||
مراحل پایین را انجام می دهد:
- عملوند ها را از چپ به راست ارزیابی می کند.
- هر عملوند را، تبدیل به boolean می کند. اگر نتیجه
true
باشد، متوقف می شود و مقدار اصلی عملوند را بر می گرداند. - اگر تمام عملوند ها ارزیابی شدند (یعنی تمام آنها
false
بودند)، عملوند آخر را بر می گرداند.
هر مقدار با شکل اصلی خود و بدون تبدیل بر گردانده می شود.
به عبارتی دیگر، یک زنجیره از OR ||
اولین مقدار truthy یا در صورتی که هیج مقدار truthy پیدا نشود آخرین مقدار را بر می گرداند.
برای مثال:
alert( 1 || 0 ); // 1 (1 truthy است)
alert( null || 1 ); // 1 (1 اولین مقدار truthy است)
alert( null || 0 || 1 ); // 1 (اولین مقدار truthy)
alert( undefined || null || 0 ); // 0 (همه falsy هستند، آخرین مقدار را بر می گرداند)
این باعث چند استفاده جالب نسبت به “OR خالص، کلاسیک، فقط-boolean” می شود.
-
گرفتن اولین مقدار truthy از یک لیست متغیرها یا عبارت ها.
برای مثال، ما متغیر های
firstName
،lastName
وnickName
داریم، همه آنها اختیاری هستند (یعنی می توانند undefined یا مقدارهای falsy داشته باشند).بیایید با استفاده از OR
||
متغیری که دارای داده است را انتخاب کنیم و آن را نمایش دهیم (یا اگر چیزی تنظیم نشده باشدAnonymous
را):let firstName = ""; let lastName = ""; let nickName = "SuperCoder"; alert( firstName || lastName || nickName || "Anonymous"); // SuperCoder
اگر تمام متغیرها falsy بودند،
"Anonymous"
نمایش داده می شد. -
ارزیابی گردش کوتاه.
یکی دیگر از ویژگی های اپراتور OR
||
به اصطلاح ارزیابی “گردش کوتاه” است.یعنی اینکه
||
روی آرگومان های خودش پردازش انجام می دهد تا زمانی که به اولین مقدار truthy برسد، و سپس آن مقدار بلافاصله بر گردانده می شود، بدون اینکه به بقیه آرگومان ها کاری داشته باشد.اهمیت این ویژگی زمانی آشکار می شود که یک عملوند فقط یک مقدار ساده نباشد، بلکه یک عبارت با یک اثر جانبی باشد، مثل تخصیص متغیر یا صدا زدن تابع.
در مثال پایین، فقط پیام دوم چاپ می شود:
true || alert("چاپ نمی شود"); false || alert("چاپ می شود");
در خط اول، عملگر OR
||
به محض دیدنtrue
ارزیابی را بلافاصله متوقف می کند، پسalert
اجرا نمی شود.بعضی اوقات، افراد از این ویژگی استفاده می کنند تا دستوراتی را فقط اگر شرط سمت چپ falsy باشد اجرا کنند.
&& (AND)
عملگر AND(و) با دو ampersand &&
نمایش داده می شود:
result = a && b;
در برنامه نویسی کلاسیک، AND اگر هر دو عملوند truthy باشند true
را بر می گرداند و در غیر این صورت false
:
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
یک مثال با if
:
let hour = 12;
let minute = 30;
if (hour == 12 && minute == 30) {
alert( 'ساعت 12:30 است' );
}
درست مثل OR، هر مقداری به عنوان عملوند AND مجاز است:
if (1 && 0) { // به عنوان true && false ارزیابی می شود
alert( "کار نخواهد کرد، چون نتیجه falsy است" );
}
AND “&&” اولین مقدار falsy را پیدا می کند
چند مقدار را همراه AND می دهیم:
result = value1 && value2 && value3;
عملگر AND &&
مراحل زیر را انجام می دهد:
- عملوند ها را از چپ به راست ارزیابی می کند.
- هر عملوند را به boolean تبدیل می کند. اگر نتیجه
false
باشد، متوقف می شود و مقدار اصلی آن عملوند را بر می گرداند. - اگر تمام عملوند ها ارزیابی شدند (یعنی همه truthy بودند)، آخرین عملوند را بر می گرداند.
به عبارتی دیگر، AND اولین مقدار falsy یا اگر هیچ falsy پیدا نشد آخرین مقدار را بر می گرداند.
قوانین بالا شبیه به قوانین OR هستند. تقاوت این است که AND اولین مقدار falsy را بر می گرداند در حالی که OR اولین مقدار truthy را بر می گرداند.
مثال ها:
// اگر عملوند اول truthy باشد،
// AND عملوند دوم را بر می گرداند:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// اگر عملوند اول falsy باشد،
// AND آن را بر می گرداند. عملوند دوم نادیده گرفته می شود.
alert( null && 5 ); // null
alert( 0 && "فرقی ندارد که چه چیزی باشد" ); // 0
ما همچنین می توانیم چند مقدار را در یک ردیف قرار بدهیم. ببینید چگونه اولین مقدار falsy بر گردانده می شود.
alert( 1 && 2 && null && 3 ); // null
وقتی که تمام مقدارها truthy باشند، آخرین مقدار بر گردانده می شود:
alert( 1 && 2 && 3 ); // 3, آخرین مقدار
&&
از OR ||
بیشتر استاولویت عملگر AND &&
بالاتر از OR ||
است.
بنابراین کد a && b || c && d
اساسا مانند این است که عبارت &&
داخل پرانتر باشد: (a && b) || (c && d)
.
if
را با ||
یا &&
جابجا نکنیدبعضی اوقات، افراد از عملگر AND &&
به عنوان "راه کوتاه تر برای نوشتن if
" استفاده می کنند.
برای مثال:
let x = 1;
(x > 0) && alert( 'بزرگ تر از صفر!' );
عمل سمت راست &&
فقط اگر ارزیابی به آن برسد اجرا می شود. یعنی اینکه، فقط اگر (x > 0)
درست باشد.
پس ما اساسا یک تشبیه برای کد زیر داریم:
let x = 1;
if (x > 0) alert( 'بزرگ تر از صفر!' );
با اینکه نوعی که همراه با &&
است ظاهر کوتاه تری دارد، if
واضح تر است و کمی خواناتر است. پس ما پیشنهاد ما این است که هر ساختار را برای هدف خودش استفاده کنیم: از if
در صورتی که if
می خواهیم استفاده کنیم و از &&
در صورتی که AND می خواهیم استفاده کنیم.
! (NOT)
عملگر NOT(نفی) با یک علامت تعجب !
نمایش داده می شود.
سینتکس بسیار ساده است:
result = !value;
عملگر یک آرگومان قبول می کند و مراحل زیر را انجام می دهد:
- عملوند را به نوع boolean تبدیل می کند:
true/false
. - مقدار معکوس را بر می گرداند.
برای مثال:
alert( !true ); // false
alert( !0 ); // true
بعضی اوقات NOT دوگانه !!
برای تبدیل یک مقدار به نوع boolean استفاده می شود:
alert( !!"string که خالی نیست" ); // true
alert( !!null ); // false
یعنی اینکه، اولین NOT مقدار را به boolean تبدیل می کند و معکوس آن را بر می گرداند، و دومین NOT دوباره آن را معکوس می کند. سرانجام، ما یک تبدیل ساده مقدار به boolean خواهیم داشت.
یک راه کلامی تر برای انجام کار مشابه وجود دارد – تابع درون ساخت Boolean
:
alert( Boolean("string که خالی نیست") ); // true
alert( Boolean(null) ); // false
عملگر NOT !
بالاترین اولویت را بین عملگر های منطقی دارد، بنابراین همیشه اول اجرا می شود، قبل از &&
یا ||
.
نظرات
<code>
استفاده کنید، برای چندین خط – کد را درون تگ<pre>
قرار دهید، برای بیش از ده خط کد – از یک جعبهٔ شنی استفاده کنید. (plnkr، jsbin، codepen…)