المعاملات المنطقية في JavaScript
المعاملات المنطقية (logical operators) تُستخدَم عادةً مع القيم المنطقية Boolean
، وستُعيد هذه المعاملات حينئذٍ قيمةً منطقيةً أيضًا؛ لكن المعاملين &&
و ||
سيُعيدان إحدى القيمتين اللتين تجريان عملياتهما عليها، لذا إذا لم تكن تلك القيمة منطقيةً (Boolean) فقد لا تُعاد قيمةٌ منطقيةٌ.
الوصف
المعاملات المنطقية موضَّحة في الجدول الآتي:
المعامل | الاستخدام | الوصف |
---|---|---|
AND (&& )
|
expr1 && expr2
|
يُعيد expr1 إذا كان بالإمكان تحويله إلى false ، وإلا فسيعيد expr2 ، وبالتالي عند استخدامه مع القيم المنطقية فسيعيد المعامل && القيمة true إذا كانت كلا القيمتين true وإلا فسيعيد false .
|
OR (|| )
|
expr1 || expr2
|
يُعيد expr1 إذا كان بالإمكان تحويله إلى true ، وإلا فسيعيد expr2 ، وبالتالي عند استخدامه مع القيم المنطقية فسيعيد المعامل || القيمة true إذا كانت إحدى القيمتين true .
|
NOT (! )
|
!expr
|
يُعيد false إذا كان بالإمكان تحويل expr إلى true ، وإلا فسيعيد true .
|
هذه أمثلة عن تعابير يمكن تحويلها إلى false
:
null
NaN
0
- سلسلة نصية فارغة
""
undefined
وعلى الرغم من أنَّ المعاملين &&
و ||
يمكن استخدامها مع القيم غير المنطقية، لكن ما يزالان يُعدَّان على أنهما معاملين منطقيين لأنَّ القيمة التي يعيدانها يمكن تحويلها دومًا إلى قيم منطقية.
تقدير القيم في «الدارات القصيرة»
لمّا كانت قيمة التعابير المنطقية تُقدَّر من اليسار إلى اليمين، فيمكن اختبار وجود «دارة قصيرة» (short-circuit) بالقاعدتين الآتيتين:
false && (anything)
دارة قصيرة قيمتها هيfalse
.true || (anything)
دارة قصيرة قيمتها هيtrue
.
القواعد المنطقية ستضمن أنَّ التعبيرين السابقين نتيجتهما محققة دومًا، ولاحظ أنَّ الجزء (anything)
من التعبير السابقين لن يُنفَّذ أبدًا، لذا لن تأخذ أيّة تأثيرات جانبية لتلك التعابير أيّ أثر. ومن الجدير بالذكر أنَّ الجزء (anything)
هو تعبيرٌ منطقيٌ وحيدٌ (كما تُشير الأقواس التي تحيط به).
على سبيل المثال، الدالتان الآتيتان متكافئتان:
function shortCircuitEvaluation() {
// logical OR (||)
doSomething() || doSomethingElse();
// logical AND (&&)
doSomething() && doSomethingElse();
}
function equivalentEvaluation() {
// logical OR (||)
var orFlag = doSomething();
if (!orFlag) {
doSomethingElse();
}
// logical AND (&&)
var andFlag = doSomething();
if (andFlag) {
doSomethingElse();
}
}
لكن التعبيرين الآتيين غير متكافئين بسبب أولوية المعاملات، ويوضِّح المثال الآتي أهمية أن تكون القيمة الموجودة على اليمين هي تعبيرٌ وحيدٌ (ويمكن وضعه ضمن أقواس إن لزم الأمر):
false && true || true // returns true
false && (true || true) // returns false
المعامل AND (&&
)
الشيفرة الآتية تُظهِر أمثلةً عن استخدام المعامل &&
:
a1 = true && true // t && t returns true
a2 = true && false // t && f returns false
a3 = false && true // f && t returns false
a4 = false && (3 == 4) // f && f returns false
a5 = 'Cat' && 'Dog' // t && t returns "Dog"
a6 = false && 'Cat' // f && t returns false
a7 = 'Cat' && false // t && f returns false
a8 = '' && false // f && f returns ""
a9 = false && '' // f && f returns false
المعامل OR (||
)
الشيفرة الآتية تُظهِر أمثلةً عن استخدام المعامل ||
:
o1 = true || true // t || t returns true
o2 = false || true // f || t returns true
o3 = true || false // t || f returns true
o4 = false || (3 == 4) // f || f returns false
o5 = 'Cat' || 'Dog' // t || t returns "Cat"
o6 = false || 'Cat' // f || t returns "Cat"
o7 = 'Cat' || false // t || f returns "Cat"
o8 = '' || false // f || f returns false
o9 = false || '' // f || f returns ""
المعامل NOT (!
)
الشيفرة الآتية تُظهِر أمثلةً عن استخدام المعامل !
:
n1 = !true // !t returns false
n2 = !false // !f returns true
n3 = !'Cat' // !t returns false
قواعد التحويل
تحويل AND إلى OR
التعبير الآتي الذي يستعمل المعاملات والقيم المنطقية:
bCondition1 && bCondition2
يكافئ التعبير الآتي دومًا:
!(!bCondition1 || !bCondition2)
تحويل OR إلى AND
التعبير الآتي الذي يستعمل المعاملات والقيم المنطقية:
bCondition1 || bCondition2
يكافئ التعبير الآتي دومًا:
!(!bCondition1 && !bCondition2)
التحويل بين حالات NOT
التعبير الآتي الذي يستعمل المعاملات والقيم المنطقية:
!!bCondition
يكافئ التعبير الآتي دومًا:
bCondition
إزالة الأقواس الزائدة
لمّا كان تقدير قيمة التعابير المنطقية من اليسار إلى اليمين، فمن الممكن إزالة الأقواس من تعبيرٍ معقدٍ باتباع بعض القواعد.
إزالة الأقواس من تعابير AND
التعبير الآتي الذي يستعمل المعاملات والقيم المنطقية:
bCondition1 || (bCondition2 && bCondition3)
يكافئ التعبير الآتي دومًا:
bCondition1 || bCondition2 && bCondition3
إزالة الأقواس من تعابير OR
التعبير الآتي الذي يستعمل المعاملات والقيم المنطقية:
bCondition1 && (bCondition2 || bCondition3)
يكافئ التعبير الآتي دومًا:
!(!bCondition1 || !bCondition2 && !bCondition3)
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 1st Edition.