المعاملات المنطقية في JavaScript

من موسوعة حسوب
مراجعة 10:57، 16 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

المعاملات المنطقية (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
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات