أحيانًا نريد تنفيذ أوامر مختلفة إعتمادًا على حالات مختلفة.
لعمل هذا يمكننا استخدام عبارة if
والالعامل الشرطي ?
, الذي يسمى أيضًا العامل “علامة الاستفهام”.
عبارة “if”
إن عبارة if(...)
تقوم بتنفيذ ما بين القوسين وإذا كانت النتيجة true
, تقوم بتنفيذ الكود المحدد.
على سبيل المثال:
let year = prompt('في أي عام تم نشر تخصيصات ECMAScript-2015?', '');
if (year == 2015) alert( 'إجابة صحيحة!' );
في هذا المثال فإن الشرط عبارة عن عملية إختبار تساوي بسيطة (year == 2015
), ولكن يمكن أن يكون أكثر تعقيدًا.
إذا أردنا تنفيذ أكثر من أمر فيجب علينا وضعهم داخل أقواس معقوفة:
if (year == 2015) {
alert("هذه صحيح!");
alert("أنت ذكي!");
}
من الأفضل أن تضع الأوامر بين أقواس معقوفة {}
في كل مرة تستخدم فيها عبارة if
حتى إذا أردت تنفيذ أمر واحد. هذا يحسن قراءة الأوامر.
التحويل إلى القيم المنطقية
عبارة if (…)
تقوم بتنفيذ التعبير المكتوب بين القوسين وتقوم بتحويل الناتج إلى قيمة منطقية.
دعنا نراجع على قواعد التحويل من هذا الدرس نوع التحويلات:
- الرقم
0
, النص الفارغ""
,null
,undefined
, وNaN
يصبحونfalse
. ولهذا السبب يسمون “falsy” قيم. - القيم الأخرى تصبح
true
, ولهذا يسمون “truthy”.
لذلك فإن الأوامر المكتوبة تحت هذا الشرط لن تنفذ أبدًا:
if (0) { // 0 يكون falsy
...
}
وفي هذه الحالة ستنفذ دائمًا:
if (1) { // 1 يكون truthy
...
}
يمكننا أيضًا تمرير قيمة منطقية مسبقة التنفيذ إلى if
, مثل:
let cond = (year == 2015); // عامل التساوي ينتج true أو false
if (cond) {
...
}
عبارة “else”
عبارة if
قد تحتوي على جزء “else” إختياري. يتم تنفيذها عندما يكون الشرط false.
على سبيل المثال:
let year = prompt("في أي عام تم نشر تخصيصات ECMAScript-2015?", "");
if (year == 2015) {
alert("تخمينك صحيح!");
} else {
alert("كيف يمكنك أن تخطئ ؟"); // any value except 2015
}
العديد من الحالات: “else if”
أحيانًا نريد إختبار العديد من الحالات المختلفة. يمكن استخدام else if
لعمل هذا.
على سبيل المثال:
let year = prompt("في أي عام تم نشر تخصيصات ECMAScript-2015?", "");
if (year < 2015) {
alert("مبكر جدًا");
} else if (year > 2015) {
alert("متأخر جدًا");
} else {
alert("تمامًا");
}
في الكود السابق, تقوم جافا سكريبت أولًا بفحص year < 2015
. إذا كان خطأ, تنتقل للشرط التالي year > 2015
. إذا كان خطأ أيضًا تعرض آخر alert
.
يمكن أن يوجد العديد من else if
. آخر else
إختيارية.
العامل الشرطي ‘?’
أحيانا نريد تخصيص قيمة متغير بناءًا على شرط معين.
على سبيل المثال:
let accessAllowed;
let age = prompt('كم عمرك ؟', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
alert(accessAllowed);
العامل الشرطي أو عامل علامة الاستفهام يمكننا من فعل هذا في سطر بسيط.
يتم تمثيله بعلامة استفهام ?
. أحيانا يسمى “ternary” لأن له 3 معاملات. وهو العامل الوحيد في جافا سكريبت الذي له هذا العدد من المعاملات.
طريقة كتابته كالتالي:
let result = condition ? value1 : value2;
يتم تنفيذ condition
وإذا كان صحيح يتم إرجاع value1
وغير ذلك يتم إرجاع value2
.
على سبيل المثال:
let accessAllowed = age > 18 ? true : false;
يمكننا تجاهل الأقواس حول age > 18
. هذا العامل لديه أولوية أقل ولهذا يتم تنفيذه بعد عملية المقارنة >
.
هذا المثال مطابق للمثال السابق:
// عامل المقارنة "age > 18" ينفذ أولًا
// (لا حاجة لوضعة داخل أقواس)
let accessAllowed = age > 18 ? true : false;
لكن الأقواس تجعل الكود مقروء أكثر ولذلك ننصح باستخدامها
في المثال السابق يمكننا عدم استخدام العامل الشرطي لأن عملية المقارنة ترجع true/false
:
// مثل
let accessAllowed = age > 18;
العديد من ‘?’
تتابع ?
يمكنه إرجاع قيمة تعتمد على أكثر من شرط.
على سبيل المثال:
let age = prompt("العمر؟", 18);
let message =
age < 3
? "مرحبًا يا صغيري!"
: age < 18
? "أهلا!"
: age < 100
? "تحياتي!"
: "يا له من عمر غير عادي!";
alert(message);
ربما يكون من الصعب معرفة ما يحدث ولكن إذا نظرنا عن قرب سنجد أنه مجرد تتابع لمجموعة إختبارات:
- أول علامة استفهام تختبر إذا كان
age < 3
. - لو صحيح ترجع
'مرحبًا يا صغيري!'
. ولو لم يكن تكمل لما بعد النقطتين '“:”'وتختبرage < 18
. - لو صحيح ترجع
'أهلا!'
. ولو لم يكن تكمل لما بعد النقطتين '“:”'وتختبرage < 100
. - لو صحيح ترجع
'تحياتي!'
. ولو لم يكن تكمل لما بعد النقطتين الأخيرتين '“:”'وترجع'يا له من عمر غير عادي!'
.
هنا ما يبدو عليه باستخدام if..else
:
if (age < 3) {
message = "مرحبًا يا صغيري!";
} else if (age < 18) {
message = "أهلا!";
} else if (age < 100) {
message = "تحياتي!";
} else {
message = "يا له من عمر غير عادي!";
}
استخدام غير عادي ل ‘?’
أحيانا يتم استخدام علامة الاستفهام ?
كبديل ل if
:
let company = prompt('أي شركة أنشأت جافا سكريبت ؟', '');
(company == 'Netscape') ?
alert('صحيح!') : alert('خطأ.');
اعتمادًا على الشرط company == 'Netscape'
, يتم تنفيذ الجزء الأول أو الثاني بعد ?
ويظهر التنبيه.
هنا لم نقم بتخصيص قيم مختلفة لمتغير بل قمنا بتنفيذ أوامر مختلفة اعتمادًا على الشرط
لا ينصح باستخدام العامل بهذه الطريقة.
هذا التعبير مختصر عن عبارة if
ولكنه أقل قراءة.
هذا نفس الكود باستخدام عبارة if
للمقارنة:
let company = prompt('أي شركة أنشأت جافا سكريبت ؟', '');
if (company == 'Netscape') {
alert('صحيح!');
} else {
alert('خطأ.');
}
عيوننا تفحص الكود رأسيًا. لذلك فإن الأكواد التي تكتب على أكثر من سطر تكون مقروءة أكثر من الأمر الذي يكتب على سطر واحد أفقي طويل.
الهدف من علامة الاستفهام ?
هو إرجاع قيمة أو أخرى اعتمادًا على شرط معين. من فضلك استخدمها لهذا الغرض فقط. واستخدم if
عندما تريد تنفيذ أوامر مختلفة في كل حالة.