Menu
العربية

شرط if/else في JavaScript: else if والعامل الثلاثي

كيف تعمل جملة if/else في جافا سكريبت؟ شرح مبسط للشروط، وسلاسل else if، ومفهوم القيم الصادقة والكاذبة، ومتى تستخدم العامل الثلاثي بدلاً منها.

شكل جملة if في جافا سكريبت

جملة if في جافا سكريبت تُنفّذ كتلة من الشيفرة فقط عندما يتحقق الشرط. وتتكوّن من كلمة مفتاحية، ثم شرط بين قوسين، ثم كتلة بين أقواس معقوفة:

index.js
Output
Click Run to see the output here.

الشرط age >= 18 ناتجه true، فيُنفَّذ ما بداخل الكتلة. ولو كانت قيمة age تساوي 16، لأصبح الشرط false وتجاوزت جافا سكريبت الكتلة بالكامل.

الأقواس المعقوفة اختيارية من الناحية التقنية عندما تحتوي الكتلة على جملة واحدة فقط، لكن احرص على استخدامها دائمًا. فجمل if بدون أقواس مصدرٌ شهير للأخطاء حين يأتي أحدهم لاحقًا ويضيف سطرًا ثانيًا ظنًّا منه أنه داخل الكتلة، وهو في الحقيقة خارجها.

else: المسار البديل

اقرن if مع else لتنفيذ شيفرة مختلفة عندما يكون الشرط خاطئًا:

index.js
Output
Click Run to see the output here.

يعمل أحد الفرعين فقط، لا كلاهما ولا أيّ منهما. كلمة else لا تأخذ شرطًا خاصًا بها، فهي ببساطة "خطة بديلة" تنفَّذ عندما يكون شرط if خاطئًا.

else if في جافا سكريبت: الاختيار بين عدة احتمالات

عندما يكون لديك أكثر من حالتين، اربطها مع بعضها باستخدام else if. تفحص جافا سكريبت كل شرط بالترتيب، وتتوقف عند أول شرط يتحقق:

index.js
Output
Click Run to see the output here.

فرعٌ واحد فقط هو الذي يُنفَّذ. بمجرّد أن يتحقّق شرطٌ ما، يتم تجاوز بقية الفروع — حتى لو كانت صحيحة هي الأخرى. ولهذا السبب يُعدّ الترتيب مهمًّا: فلو قلبتَ السلسلة وبدأت بفحص score >= 60 أولًا، لحصل كلّ من تجاوز الستّين على تقدير D.

الجزء else الأخير اختياري، لكن إضافته توضّح نيّتك بجلاء: "إن لم يتحقّق أيّ شيء ممّا سبق، نفِّذ هذا".

الشرط يمكن أن يكون أيّ تعبير

ما يوضع بين القوسين ليس بالضرورة عمليّة مقارنة، بل يمكن أن يكون أيّ تعبير — إذ تقوم جافا سكريبت بتحويل الناتج تلقائيًّا إلى قيمة منطقيّة (boolean):

index.js
Output
Click Run to see the output here.

السلاسل النصية غير الفارغة تُعتبر truthy. أما 0 والسلسلة الفارغة فهي falsy، ولذلك عندما تكون items.length تساوي 0 يُنفَّذ فرع else. هذا هو الأسلوب المتعارف عليه في جافا سكريبت للتحقق من "وجود شيء ما".

قائمة قيم falsy في javascript قصيرة ويستحق حفظها: false و0 و-0 و0n و"" وnull وundefined وNaN. وما عدا ذلك فهو truthy — بما في ذلك "0" و"false" و[] و{}. هذه الأخيرة تُربك كثيرًا من المبتدئين.

دمج الشروط: العاملان && و||

لدمج أكثر من شرط في جملة شرطية واحدة، استخدم && (و) و|| (أو):

index.js
Output
Click Run to see the output here.

&& يشترط أن يكون الطرفان صادقَين (truthy)، بينما || يكفيه طرف واحد صادق. كلاهما يعتمد على التقييم المختصر (short-circuit): فـ && يتوقف عند أول قيمة كاذبة (falsy)، و|| يتوقف عند أول قيمة صادقة. وهذه نقطة مهمة حين يكون للشرط الثاني أثر جانبي أو قد يُطلق خطأً — فمثلاً user && user.name يُرجع undefined بأمان إذا كان user يساوي null، دون أن ينهار الكود.

ضع المنطق المختلط بين أقواس لتوضيح أولوية التنفيذ:

index.js
Output
Click Run to see the output here.

بدون الأقواس، يكون ارتباط && أقوى من ||، وهذا عادةً عكس ما تتوقعه من قراءة الشرط بشكل طبيعي.

الفرق بين == و === (استخدم === دائمًا)

عند التحقق من المساواة داخل if، استخدم === و !==، وليس == و !=:

index.js
Output
Click Run to see the output here.

المعامل == يقوم بتحويل الأنواع قبل المقارنة، وهذا يؤدي إلى مفاجآت غريبة مثل أن "" == 0 تُرجع true، وكذلك null == undefined تُرجع true. أما === فيقارن بدون أي تحويل للنوع، أي نفس النوع ونفس القيمة. القاعدة: استخدم === افتراضياً. الاستثناء الشائع الوحيد هو x == null، لأنه يتحقق من null وundefined معاً في خطوة واحدة.

العامل الثلاثي في جافا سكريبت

عندما تحتاج للاختيار بين قيمتين فقط، يكون العامل الثلاثي condition ? a : b أنظف وأوضح من كتابة if/else كاملة:

index.js
Output
Click Run to see the output here.

العامل الثلاثي هو تعبير (expression) — أي أنه يُنتج قيمة. وهذا هو الفرق الجوهري بينه وبين if/else الذي يُعدّ جملة (statement). استخدم العامل الثلاثي عندما تحتاج إلى النتيجة فعلًا (إسناد متغير، أو إرجاع قيمة، أو بناء نص). أما if/else فاستخدمه عندما تُنفّذ آثارًا جانبية (side effects).

يمكنك نظريًا تسلسل عدة عوامل ثلاثية معًا، لكن قابلية القراءة تنهار تمامًا:

// لا تفعل هذا:
const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";

إذا كنت ستسلسل عدة شروط، عُد إلى else if.

if المتداخلة مقابل else if المسطّحة

أحيانًا يكون الشرط منطقيًا فقط داخل شرط آخر. في هذه الحالة، لا بأس باستخدام if متداخلة:

index.js
Output
Click Run to see the output here.

لكن التداخل لثلاثة أو أربعة مستويات يُعتبر مؤشّرًا على كود سيّئ. بدل ذلك، سطِّح الشروط باستخدام الإرجاع المبكر أو ادمجها في شرط واحد:

index.js
Output
Click Run to see the output here.

الـ early return يخلّي كل فرع قصير وعلى نفس مستوى المسافة البادئة. تقرأ الكود بسهولة، أحسن بكثير من هرم من الـ if المتداخلة.

خطأ شائع: الإسناد داخل if

= للإسناد، أما === فهي للمقارنة. الخلط بينهما داخل الشرط من أشهر الأخطاء في جافا سكريبت:

index.js
Output
Click Run to see the output here.

status = "done" يعني إسناد القيمة "done" إلى المتغير status، والتعبير نفسه ينتج "done" وهي قيمة truthy — فينفّذ الشرط دائمًا، وتكون قد دهست قيمة المتغير دون أن تنتبه. أدوات الـ linter تكتشف هذا الخطأ، أما الوضع الصارم (strict mode) فلا. خذ حذرك، واستعمل === متى أردت المقارنة فعلاً.

الخطوة التالية: جملة switch

عندما تقارن قيمة واحدة بعدة احتمالات، تبدأ سلسلة else if الطويلة بالشعور بالتكرار الممل. جملة switch في جافا سكريبت مصمّمة تحديدًا لهذه الحالة — ولها خصوصياتها الخاصة فيما يتعلق بـ break وظاهرة الـ fall-through، وهذا ما سنتناوله بعد قليل.

الأسئلة الشائعة

كيف أكتب جملة if/else في جافا سكريبت؟

تضع الشرط بين قوسين بعد if، ثم كتلة الأوامر بين أقواس معقوفة، وتتبعها بـ else وكتلة أخرى للحالة البديلة. مثال: if (age >= 18) { console.log('adult'); } else { console.log('minor'); }. الشرط يمكن أن يكون أي تعبير، لأن جافا سكريبت ستحوّله تلقائياً إلى قيمة منطقية (boolean).

ما الفرق بين else if و if المتداخلة في جافا سكريبت؟

else if يربط عدة شروط متتالية بحيث يُنفَّذ فرع واحد فقط — جافا سكريبت تفحص الشروط بالترتيب وتتوقف عند أول شرط يتحقق. أما if المتداخلة فهي وضع جملة if داخل أخرى، وغالباً تُستخدم لفحص شرط ثانوي بعد تحقق الأول. في أغلب الحالات، سلاسل else if المسطّحة أوضح وأسهل قراءة من التداخل العميق.

متى أستخدم العامل الثلاثي بدلاً من if/else؟

استخدم العامل الثلاثي condition ? a : b عندما تختار بين قيمتين داخل تعبير واحد — مثل إسناد قيمة لمتغير، أو إرجاع قيمة من دالة، أو بناء نص. والتزم بـ if/else عندما يكون الفرعان يحتويان على جمل ذات تأثير جانبي (side effects) أو عندما يكون أحد الفرعين أطول من تعبير قصير. تذكّر أن تسلسل العوامل الثلاثية يصبح صعب القراءة بسرعة.

لماذا تتصرف if (0) بنفس طريقة if (false) في جافا سكريبت؟

في الحقيقة هما متطابقتان — كلاهما يتخطى الكتلة. جافا سكريبت تحوّل الشرط إلى قيمة منطقية، والقيم 0 و '' و null و undefined و NaN و false جميعها تُعتبر falsy. الفخ الشائع أن قيماً مثل '0' (نص غير فارغ) و [] (مصفوفة فارغة) تُعتبر truthy، وهذا ما يفاجئ القادمين من لغات أخرى.

تعلّم البرمجة مع Coddy

ابدأ الآن