هناك أربعة عوامل منطقية في JavaScript: ||
(أو)، &&
(و)، !
(لا)، ??
(الدمج الفارغ). نحن هنا نغطي الثلاثة الأولى، ??
المشغل في المقالة التالية.
على الرغم من أنها تسمى "منطقية"، إلا أنه يمكن تطبيقها على القيم من أي نوع، وليس فقط القيم المنطقية. يمكن أن تكون نتائجها أيضًا من أي نوع.
دعونا نرى التفاصيل.
يتم تمثيل عامل التشغيل "OR" برمزين خطيين رأسيين:
النتيجة = || ب؛
في البرمجة الكلاسيكية، المقصود من OR المنطقي هو معالجة القيم المنطقية فقط. إذا كانت أي من حججها true
، فإنها ترجع true
، وإلا فإنها ترجع false
.
في JavaScript، يكون عامل التشغيل أصعب قليلاً وأكثر قوة. لكن أولاً، دعونا نرى ما يحدث مع القيم المنطقية.
هناك أربع مجموعات منطقية محتملة:
تنبيه (صحيح || صحيح)؛ // حقيقي تنبيه (خطأ || صحيح)؛ // حقيقي تنبيه (صحيح || خطأ)؛ // حقيقي تنبيه (خطأ || خطأ)؛ // خطأ شنيع
كما نرى، النتيجة دائمًا true
باستثناء الحالة التي يكون فيها كلا المعاملين false
.
إذا لم يكن المعامل قيمة منطقية، فسيتم تحويله إلى قيمة منطقية للتقييم.
على سبيل المثال، يتم التعامل مع الرقم 1
على أنه true
، والرقم 0
على أنه false
:
إذا (1 || 0) {// يعمل تمامًا مثل if( true || false ) تنبيه ("حقيقي!")؛ }
في أغلب الأحيان، أو ||
يتم استخدامه في عبارة if
لاختبار ما إذا كان أي من الشروط المحددة true
.
على سبيل المثال:
دع الساعة = 9؛ إذا (ساعة < 10 || ساعة > 18) { تنبيه("المكتب مغلق."); }
يمكننا تمرير المزيد من الشروط:
دع الساعة = 12؛ Let isWeekend = true; إذا (ساعة < 10 || ساعة > 18 || نهاية الأسبوع) { تنبيه("المكتب مغلق."); // إنها عطلة نهاية الأسبوع }
المنطق الموصوف أعلاه كلاسيكي إلى حد ما. الآن، دعونا نجلب الميزات "الإضافية" لجافا سكريبت.
تعمل الخوارزمية الموسعة على النحو التالي.
بالنظر إلى قيم OR'ed المتعددة:
النتيجة = القيمة 1 || القيمة 2 || value3;
غرفة العمليات ||
يقوم المشغل بما يلي:
يقيم المعاملات من اليسار إلى اليمين.
لكل معامل، يحوله إلى منطقي. إذا كانت النتيجة true
، يتوقف ويعيد القيمة الأصلية لذلك المعامل.
إذا تم تقييم كافة المعاملات (أي كانت جميعها false
)، فسيتم إرجاع المعامل الأخير.
يتم إرجاع القيمة في شكلها الأصلي، دون التحويل.
بمعنى آخر، سلسلة OR ||
تُرجع القيمة الصادقة الأولى أو القيمة الأخيرة إذا لم يتم العثور على قيمة الصدق.
على سبيل المثال:
تنبيه(1 ||0 ); // 1 (1 صادق) تنبيه (فارغ || 1)؛ // 1 (1 هي القيمة الصادقة الأولى) تنبيه (فارغة || 0 || 1 ); // 1 (القيمة الصادقة الأولى) تنبيه (غير محدد || فارغ || 0 ); // 0 (كلها خاطئة، تُرجع القيمة الأخيرة)
يؤدي هذا إلى بعض الاستخدام المثير للاهتمام مقارنةً بـ "OR" النقي والكلاسيكي والمنطقي فقط.
الحصول على القيمة الصادقة الأولى من قائمة المتغيرات أو التعبيرات.
على سبيل المثال، لدينا متغيرات firstName
lastName
والاسم nickName
، وجميعها اختيارية (أي يمكن أن تكون غير محددة أو تحتوي على قيم خاطئة).
دعونا نستخدم أو ||
لاختيار الشخص الذي يحتوي على البيانات وإظهارها (أو "Anonymous"
إذا لم يتم تعيين أي شيء):
دع الاسم الأول = ""; اسمحوا الاسم الأخير = ""; Let nickName = "SuperCoder"; تنبيه (الاسم الأول || الاسم الأخير || الاسم المستعار || "مجهول"); // سوبركودر
إذا كانت جميع المتغيرات خاطئة، فسوف يظهر "Anonymous"
.
تقييم ماس كهربائى.
ميزة أخرى لـ OR ||
المشغل هو ما يسمى بتقييم "الدائرة القصيرة".
يعني ||
يعالج وسيطاته حتى يتم الوصول إلى القيمة الحقيقية الأولى، ثم يتم إرجاع القيمة على الفور، حتى دون لمس الوسيطة الأخرى.
تصبح أهمية هذه الميزة واضحة إذا لم يكن المعامل مجرد قيمة، بل كان تعبيرًا له تأثير جانبي، مثل إسناد متغير أو استدعاء دالة.
في المثال أدناه، تتم طباعة الرسالة الثانية فقط:
صحيح || تنبيه("غير مطبوع"); كاذبة || تنبيه ("مطبوع")؛
في السطر الأول، OR ||
يقوم عامل التشغيل بإيقاف التقييم فور رؤيته true
، لذلك لا يتم تشغيل alert
.
في بعض الأحيان، يستخدم الأشخاص هذه الميزة لتنفيذ الأوامر فقط إذا كان الشرط الموجود على الجزء الأيسر غير صحيح.
يتم تمثيل عامل التشغيل AND بعلامتي العطف &&
:
النتيجة = أ && ب؛
في البرمجة الكلاسيكية، تُرجع الدالة AND true
إذا كان كلا المعاملين صادقين false
بخلاف ذلك:
تنبيه (صحيح && صحيح)؛ // حقيقي تنبيه (خطأ && صحيح)؛ // خطأ شنيع تنبيه (صحيح && خطأ)؛ // خطأ شنيع تنبيه (خطأ && خطأ)؛ // خطأ شنيع
مثال مع if
:
دع الساعة = 12؛ دع الدقيقة = 30؛ إذا (الساعة == 12 && الدقيقة == 30) { تنبيه("الساعة 12:30"); }
كما هو الحال مع OR، يُسمح بأي قيمة كمعامل AND:
إذا (1 && 0) {// تم تقييمه على أنه صحيح && خطأ تنبيه ("لن يعمل، لأن النتيجة خاطئة")؛ }
بالنظر إلى قيم AND المتعددة:
النتيجة = value1 && value2 && value3;
يقوم عامل التشغيل AND &&
بما يلي:
يقيم المعاملات من اليسار إلى اليمين.
لكل معامل، يحوله إلى قيمة منطقية. إذا كانت النتيجة false
، يتوقف ويعيد القيمة الأصلية لذلك المعامل.
إذا تم تقييم جميع المعاملات (أي كانت جميعها صحيحة)، فسيتم إرجاع المعامل الأخير.
بمعنى آخر، تقوم AND بإرجاع القيمة الخاطئة الأولى أو القيمة الأخيرة إذا لم يتم العثور على أي منها.
القواعد المذكورة أعلاه مشابهة لـ OR. الفرق هو أن AND تقوم بإرجاع القيمة الخاطئة الأولى بينما تقوم OR بإرجاع القيمة الصحيحة الأولى.
أمثلة:
// إذا كان المعامل الأول صحيحًا، // AND يُرجع المعامل الثاني: تنبيه(1 && 0); // 0 تنبيه (1 && 5)؛ // 5 // إذا كان المعامل الأول خطأ // وإرجاعه. يتم تجاهل المعامل الثاني تنبيه (فارغ && 5)؛ // باطل تنبيه(0 && "مهما حدث"); // 0
يمكننا أيضًا تمرير عدة قيم على التوالي. انظر كيف يتم إرجاع الخطأ الأول:
تنبيه(1 && 2 && null && 3 ); // باطل
عندما تكون جميع القيم صحيحة، يتم إرجاع القيمة الأخيرة:
تنبيه (1 && 2 && 3 ); // 3، الأخير
أسبقية AND &&
أعلى من OR ||
أسبقية عامل التشغيل AND &&
أعلى من OR ||
.
إذن الكود a && b || c && d
هو في الأساس نفس الشيء كما لو كانت التعبيرات &&
بين قوسين: (a && b) || (c && d)
.
لا تستبدل if
بـ ||
أو &&
في بعض الأحيان، يستخدم الأشخاص عامل التشغيل AND &&
باعتباره "طريقة أقصر لكتابة if
".
على سبيل المثال:
دع س = 1؛ (x > 0) && تنبيه( 'أكبر من الصفر!' );
لن يتم تنفيذ الإجراء الموجود في الجزء الأيمن من &&
إلا إذا وصل التقييم إليه. أي فقط إذا كانت (x > 0)
صحيحة.
لذلك لدينا في الأساس نظير لـ:
دع س = 1؛ إذا (x > 0) تنبيه( 'أكبر من الصفر!' );
على الرغم من أن المتغير مع &&
يبدو أقصر، if
أنه أكثر وضوحًا ويميل إلى أن يكون أكثر قابلية للقراءة قليلاً. لذلك نوصي باستخدام كل بنية لغرضها: استخدم if
أردنا if
واستخدم &&
إذا أردنا AND.
يتم تمثيل عامل التشغيل NOT المنطقي بعلامة تعجب !
.
بناء الجملة بسيط جدًا:
النتيجة = !القيمة؛
يقبل عامل التشغيل وسيطة واحدة ويقوم بما يلي:
يحول المعامل إلى نوع منطقي: true/false
.
إرجاع القيمة العكسية.
على سبيل المثال:
تنبيه(!صحيح); // خطأ شنيع تنبيه( !0 ); // حقيقي
مزدوج لا !!
يُستخدم أحيانًا لتحويل قيمة إلى نوع منطقي:
تنبيه( !!"سلسلة غير فارغة"); // حقيقي تنبيه( !!null); // خطأ شنيع
أي أن NOT الأول يحول القيمة إلى قيمة منطقية ويعيد العكس، والثاني NOT يعكسها مرة أخرى. في النهاية، لدينا تحويل عادي من القيمة إلى القيمة المنطقية.
هناك طريقة أكثر تفصيلاً لفعل الشيء نفسه - دالة Boolean
مضمنة:
تنبيه( Boolean("سلسلة غير فارغة")); // حقيقي تنبيه (منطقية (خالية))؛ // خطأ شنيع
أسبقية NOT !
هو الأعلى بين جميع العوامل المنطقية، لذلك يتم تنفيذه دائمًا أولاً، قبل &&
أو ||
.
الأهمية: 5
ما هو الكود أدناه الذي سيخرج؟
تنبيه (فارغة || 2 || غير محددة)؛
الجواب هو 2
، هذه هي القيمة الحقيقية الأولى.
تنبيه (فارغة || 2 || غير محددة)؛
الأهمية: 3
ماذا سيخرج الكود أدناه؟
تنبيه( تنبيه(1) || 2 || تنبيه(3) );
الجواب : أولا 1
ثم 2
.
تنبيه( تنبيه(1) || 2 || تنبيه(3) );
استدعاء alert
لا يُرجع قيمة. أو بمعنى آخر، تُرجع undefined
.
غرفة العمليات الأولى ||
بتقييم المعامل الأيسر الخاص به alert(1)
. وهذا يظهر الرسالة الأولى مع 1
.
يُرجع alert
undefined
، لذا ينتقل OR إلى المعامل الثاني للبحث عن قيمة صحيحة.
المعامل الثاني 2
هو الصدق، فيتوقف التنفيذ، ويعاد 2
ثم يظهر بواسطة التنبيه الخارجي.
لن يكون هناك 3
لأن التقييم لا يصل إلى alert(3)
.
الأهمية: 5
ما الذي سيظهره هذا الرمز؟
تنبيه(1 &&خالي &&2);
الجواب: null
، لأنها أول قيمة خاطئة من القائمة.
تنبيه (1 && لاغية && 2)؛
الأهمية: 3
ماذا سيظهر هذا الرمز؟
تنبيه( تنبيه(1) && تنبيه(2) );
الجواب : 1
ثم undefined
.
تنبيه( تنبيه(1) && تنبيه(2) );
يُرجع استدعاء alert
undefined
(يُظهر فقط رسالة، لذلك ليس هناك أي رد ذي معنى).
وبسبب ذلك، يقوم &&
بتقييم المعامل الأيسر (المخرجات 1
)، ويتوقف فورًا، لأن القيمة undefined
هي قيمة خاطئة. ويبحث &&
عن قيمة خاطئة ويعيدها، وبذلك يتم الأمر.
الأهمية: 5
ماذا ستكون النتيجة؟
تنبيه(فارغة || 2 && 3 || 4 );
الجواب : 3
.
تنبيه(فارغة || 2 && 3 || 4 );
أسبقية AND &&
أعلى من ||
، لذلك يتم تنفيذه أولاً.
نتيجة 2 && 3 = 3
فيصبح التعبير:
فارغة || 3 || 4
الآن النتيجة هي القيمة الصادقة الأولى: 3
.
الأهمية: 3
اكتب شرط if
للتحقق من أن age
يتراوح بين 14
و 90
.
"الشامل" يعني أن age
يمكن أن يصل إلى حدود 14
أو 90
.
إذا (العمر >= 14 && العمر >= 90)
الأهمية: 3
اكتب شرط if
للتأكد من أن age
لا يتراوح بين 14
و 90
بشكل شامل.
قم بإنشاء متغيرين: الأول باستخدام NOT !
والثاني – بدونه.
البديل الأول:
إذا (!(العمر >= 14 && العمر <= 90))
البديل الثاني:
إذا (العمر أقل من 14 || العمر > 90)
الأهمية: 5
أي من هذه alert
سوف يتم تنفيذها؟
ماذا ستكون نتائج التعابير بالداخل if(...)
؟
إذا (-1 || 0) تنبيه( 'الأول' ); إذا (-1 && 0) تنبيه( 'الثانية' ); إذا (خالية || -1 && 1) تنبيه( 'الثالث' );
الجواب: سيتم تنفيذ الأول والثالث.
تفاصيل:
// يعمل. // نتيجة -1 || 0 = -1، صدق إذا (-1 || 0) تنبيه( 'الأول' ); // لا يعمل // -1 && 0 = 0، خطأ إذا (-1 && 0) تنبيه( 'الثانية' ); // ينفذ // العامل && له أسبقية أعلى من || // لذا، يتم تنفيذ -1 && 1 أولاً، مما يعطينا السلسلة: // فارغة || -1 && 1 -> فارغة || 1 -> 1 إذا (خالية || -1 && 1) تنبيه( 'الثالث' );
الأهمية: 3
اكتب الكود الذي يطلب تسجيل الدخول باستخدام prompt
.
إذا أدخل الزائر "Admin"
، prompt
كلمة المرور، وإذا كان الإدخال عبارة عن سطر فارغ أو Esc - أظهر "Canceled"، إذا كانت سلسلة أخرى - ثم أظهر "I don't know you".
يتم التحقق من كلمة المرور على النحو التالي:
إذا كان يساوي "TheMaster"، فقم بإظهار "مرحبًا!"،
سلسلة أخرى - عرض "كلمة المرور خاطئة"،
بالنسبة لسلسلة فارغة أو مدخلات ملغاة، أظهر "تم الإلغاء"
المخطط:
الرجاء استخدام كتل if
متداخلة. انتبه إلى سهولة القراءة الشاملة للكود.
تلميح: يؤدي تمرير إدخال فارغ إلى الموجه إلى إرجاع سلسلة فارغة ''
. يؤدي الضغط على ESC أثناء المطالبة إلى إرجاع القيمة null
.
قم بتشغيل العرض التوضيحي
Let userName = موجه("من هناك؟", ''); إذا (اسم المستخدم === "المسؤول") { Let pass = موجه('كلمة المرور؟', ''); إذا (تمرير === 'TheMaster') { تنبيه ("مرحبًا!")؛ } else if (pass === '' || pass === null) { تنبيه("تم الإلغاء"); } آخر { تنبيه ("كلمة مرور خاطئة")؛ } } else if (userName === '' || اسم المستخدم === null) { تنبيه("تم الإلغاء"); } آخر { تنبيه ("أنا لا أعرفك")؛ }
لاحظ المسافات البادئة الرأسية داخل كتل if
. إنها غير مطلوبة من الناحية الفنية، ولكنها تجعل التعليمات البرمجية أكثر قابلية للقراءة.