رسالة الموقع
هل ( || && ) معاملات منطقية حقا في الجافا سكربت ؟

هل ( || && ) معاملات منطقية حقا في الجافا سكربت ؟

كلنا نعرف المعاملات المنطقية || بمعنى " أو " && بمعنى " و " , و ندرسها ضمن المعاملات_المنطقية logical_operators
لكن هل هما حقا من المعاملات المنطقية في الجافا سكربت ؟
    
قبل أن تجيب على السؤال , دعني أوضح لك أن المعاملات المنطقية logical operators من المفترض أن تعيد لنا قيمة نوعها boolean , أي تعيد لنا true أو false فقط , و اﻵن انظر للمثال التالي في الجافا سكربت

let a = 10;
let b = "foo"
let c = null;

// how || operates
let d = a || b; // 10
let e = c || b; // "foo"

// how && operates
let f = a && b; // "foo"
let g = c && b; // null
    
كما ترى فإن المعاملان || و && في اﻷمثلة السابقة لم يعيدا لنا قيمة boolean و لكن القيمة التي أعادوها كانت أحد طرفي المعامل , و اﻵن نوضح ماذا حدث بالتفصيل :
    

أولا بالنسبة للمعامل ||

هذا المعامل يقوم بالتحقق من القيمة الموجودة قبله هل هي true أم false , فإذا كانت هذه القيمة true فإنه يقوم بإعادتها بدون التحقق من القيمة الموجودة بعده , أما إذا كانت القيمة الموجودة قبله false فإن المعامل || يقوم بإعادة القيمة الموجودة بعده. هذا إذا كانت القيم الموجودة قبله و بعده من النوع boolean , أما إذا كانت القيم على جانبي المعامل || ليست من النوع boolean فإن المعامل || يقوم بعملية تحويل القيم إلى النوع boolean ليتمكن من إجراء المقارنة و لكنه ليس تحويل حقيقي فالقيم تظل كما هي , هو فقط يتحقق من كونها truthy أو falsy و لمعرفة المزيد حول هذه النقطة راجع المقالة التالية :


فنجد في المثال السابق , عند المتغير d قام المعامل || بالتحقق أولا من القيمة السابقة له , و هي قيمة المتغير a , و طبعا قيمة المتغير a ليست من النوع boolean , و لكنها قيمة رقمية لا تساوي الصفر و بالتالي فهي truthy value و لذا قام المعامل || بإرجاع هذه القيمة.
    
و عند المتغير e قام المعامل || بالتحقق أولا من القيمة السابقة له , و هي قيمة المتغير c , و من جديد هي ليست من النوع boolean و عند تحويل هذه القيمة إلى boolean ﻹجراء المقارنة نجد أنها falsy value ﻷنها قيمة null , و بالتالي لم يقم المعامل || بإعادتها و ذهب مباشرة إلى القيمة الموجودة بعدها و أعادها , و هي قيمة المتغير b.
    
    

ثانيا بالنسبة للمعامل &&

على عكس المعامل || , نجد أن المعامل && يقوم بالتحقق من القيمة السابقة له أولا , فإذا كانت false أو falsy فإنه يقوم بإعادتها بدون التحقق من القيمة التي تليه , أما إذا كانت القيمة السابقة للمعامل && true أو truthy فإن المعامل && يتحقق بعدها من القيمة التي تليه , فإذا كانت false أو falsy فإنه يعيد القيمة السابقة له , أما إذا كانت القيمتين true أو truthy فإنه يعيد فقط القيمة التي تليه.
    
في المثال السابق , عند المتغير f نجد أن المعامل && قام بالتحقق من القيمتين السابقة و اللاحقة له a و b فوجد أن كلاهما truthy values و بالتالي قام بإعادة القيمة التي تليه , و هي قيمة المتغير b.
    
و عند المتغير g نجد أن المعامل && قام بالتحقق من القيمتين السابقة و اللاحقة له c و b فوجد أن القيمة السابقة له c تعتبر falsy value ﻷنها null , أما القيمة التي تليه فهي truthy value , فهنا بما أن إحدى القيمتين false أو falsy فإن المعامل && يعيد القيمة السابقة له , و لذا أعاد القيمة null.
    
                
* ملحوظة هامة
المعاملان || و && في الجافا سكربت يقوما بإعادة إحدى القيمتين على يمين و يسار المعامل , بحسب المعامل نفسه و نتيجة الشرط ككل كما وضحنا , و عندما تكون قيمة الشرط ككل false فإن المعامل || يعيد القيمة التي تليه حتى لو كانت هذه القيمة نفسها false أو falsy value , و كذلك إذا كانت قيمة الشرط ككل false فإن المعامل && يعيد القيمة السابقة له حتى لو كانت هذه القيمة false أو falsy value , كما حدث مع المتغير g في المثال السابق.
    
و لتلخيص ما سبق و بالاقتباس من توصيف لغة الجافا سكربت بحسب اتحاد ECMA
The value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one the two operand expressions.
    
    

هل ينحصر عمل المعاملان || و && على قيمتين فقط ؟

بالتأكيد لا , و لتوضيح المقصود انظر الكود التالي
let a = b && c && d && f && g;
    
المعامل && سيبدأ بالمرور على القيم من اليسار إلى اليمين , أي من القيمة b و ما بعدها , و عند أول قيمة false أو falsy سيقوم بإعادتها و يتوقف , أما إذا كانت كل القيم true أو truthy فإن المعامل && سوف يعيد آخر قيمة فقط , و هي في المثال السابق g.
    
على العكس يعمل المعامل || , فمثلا
let a = b || c || d || e || f || g;
أيضا المعامل || سيبدأ بالمرور على القيم من اليسار إلى اليمين , أي من القيمة b و ما بعدها , و لكنه يبحث عن أول قيمة true أو truthy يجدها , حيث سيقوم بإعادتها و يتوقف , أما إذا كانت كل القيم false أو false فإن المعامل || سوف يعيد فقط آخر قيمة.
مشاركات ذات صلة