هر برنامه‌ای نیاز به واکنش نشان دادن دارد. کاربر روی یک دکمه کلیک می‌کند. یک API داده‌ها را برمی‌گرداند. یک فیلد فرم خالی می‌شود. بدون راهی برای ایجاد شاخه‌ها، کد شما صرف‌نظر از آنچه واقعاً در حال رخ دادن است، خط به خط اجرا می‌شود. دستورات شرطی (Conditionals) این توانایی انتخاب را به JavaScript می‌دهند. آن‌ها تصمیم‌گیرندگان درون توابع شما و نگهبانانی هستند که تعیین می‌کنند چه چیزی اجرا شود و چه چیزی نادیده گرفته شود. وقتی یاد بگیرید چگونه آن‌ها را به خوبی بنویسید، دیگر اسکریپت‌های خشک و صلب نمی‌نویسید، بلکه شروع به ساخت نرم‌افزاری می‌کنید که واقعاً پاسخگو است.

چرا دستورات شرطی اهمیت دارند

جریان کنترل (Control flow) ستون فقرات منطق است. شما از دستورات شرطی برای اعتبارسنجی رمز عبور قبل از ارسال آن به سرور استفاده می‌کنید. قبل از محاسبه مالیات، بررسی می‌کنید که آیا سبد خرید خالی است یا خیر. تشخیص می‌دهید که آیا یک درخواست شبکه با شکست مواجه شده است یا خیر تا بتوانید به جای یک صفحه خالی، یک خطا نشان دهید. تمام این سناریوها بر یک ایده ساده استوار هستند: چیزی را ارزیابی کنید، سپس بر همان اساس عمل کنید.

بدون دستورات شرطی، اپلیکیشن شما به جای یک گفتگو، یک تک‌گویی خواهد بود. نمی‌تواند سناریوهای مختلف داده را مدیریت کند، خطاها را به درستی کنترل کند یا به اقدامات کاربر به شکلی معنادار واکنش نشان دهد. آن‌ها به شما اجازه می‌دهند کنترل کنید که برنامه شما در شرایط عدم قطعیت دنیای واقعی چگونه اجرا شود.

دستور ساده if

ساده‌ترین نقطه برای شروع، دستور if به تنهایی است. این دستور می‌گوید: اگر این مورد درست است، این کار را انجام بده. همین و بس. بدون مسیر جایگزین یا مسیر فرعی.

if (x % 2 === 0) {
    console.log("Even");
}

در این قطعه کد، عملگر باقی‌مانده (modulus) بررسی می‌کند که آیا x بر دو بخش‌پذیر است یا خیر. وقتی باقی‌مانده صفر باشد، رشته در کنسول چاپ می‌شود. اگر x فرد باشد، هیچ اتفاقی نمی‌افتد؛ بلوک نادیده گرفته شده و اجرا به خطوط پایین ادامه می‌یابد.

این نادیده گرفتنِ بی‌صدا مهم است. گاهی اوقات فقط می‌خواهید از یک عمل واحد محافظت کنید. شاید بخواهید یک کلاس CSS را فقط زمانی که دکمه فعال است به آن اضافه کنید، یا یک آیتم را فقط زمانی که ورودی خالی نیست به یک آرایه اضافه کنید. یک دستور if ساده، این لحظات را بدون مجبور کردن شما به نوشتن منطقی که نیاز ندارید، مدیریت می‌کند.

اضافه کردن یک جایگزین با if-else

تصمیمات واقعی معمولاً دو جنبه دارند. یا کاربر سن کافی دارد، یا ندارد. یا پرداخت موفقیت‌آمیز بوده، یا شکست خورده است. ساختار if-else هر دو حالت را پوشش می‌دهد.

if (age >= 18) {
    console.log("Adult");
} else {
    console.log("Not an Adult");
}

بلوک else هر چیزی را که شرط اول رد کرده باشد، در بر می‌گیرد. این کار یک شاخه دوتایی (binary) تمیز ایجاد می‌کند. این الگو برای سوئیچ‌ها (toggles)، مجوزها (permissions) و پرچم‌های ویژگی (feature flags) بسیار خوب عمل می‌کند. منطق داخل هر بلوک را متمرکز نگه دارید. اگر دیدید که وظایف بسیار زیادی را در یک شاخه انباشته می‌کنید، این معمولاً نشانه‌ای است که باید کار را به توابع کوچک‌تر تقسیم کنید.

بررسی مسیرهای متعدد با else if

زندگی به ندرت تنها دو انتخاب پیش روی ما می‌گذارد. ممکن است نیاز داشته باشید یک عدد را به عنوان مثبت، منفی یا صفر دسته‌بندی کنید. ممکن است بر اساس بازه‌های وزنی، نرخ حمل و نقل را تعیین کنید. برای مقایسه‌های متعدد و مرتب‌شده، از else if استفاده کنید.

if (x > 0) {
    console.log("Positive");
} else if (x < 0) {
    console.log("Negative");
} else {
    console.log("Zero");
}

جاوااسکریپت این‌ها را از بالا به پایین ارزیابی می‌کند. به محض اینکه یک شرط برقرار شد، آن بلوک را اجرا کرده و بقیه را نادیده می‌گیرد. ترتیب اهمیت دارد. اگر x > 0 را بعد از بررسی x > 100 چک کنید، شرط سخت‌گیرانه‌تر هرگز اجرا نخواهد شد، زیرا شرط آسان‌تر اول آن را شکار می‌کند. به else if به عنوان یک لیست اولویت نگاه کنید.

دستور switch

وقتی یک مقدار را با گزینه‌های مجزای زیادی مقایسه می‌کنید، زنجیره طولانی از دستورات else if می‌تواند تکراری به نظر برسد. دستور switch این موضوع را مرتب می‌کند. این دستور یک عبارت را با بندهای case مطابقت داده و بلوک مطابقت یافته را اجرا می‌کند.

switch (true) {
    case marks >= 90:
        Branch = "Computer science";
        break;
    case marks >= 80:
        Branch = "Mechanical";
        break;
    default:
        Branch = "Other";
}

این مثال از switch(true) برای ارزیابی مستقیم شرایط بولین استفاده می‌کند که یک الگوی رایج در جاوااسکریپت است، زمانی که منطق شما به جای برابری دقیق، بر بازه‌ها تکیه دارد. کلمه کلیدی break ضروری است. بدون آن، اجرا بدون توجه به اینکه با مورد بعدی مطابقت دارد یا خیر، به مورد بعدی می‌رود، که معمولاً چیزی نیست که در اینجا بخواهید. بند default مانند یک else نهایی عمل می‌کند و هر چیزی را که در موارد قبلی جا نشده بود، در بر می‌گیرد.

دستور switch زمانی می‌درخشد که گزینه‌های واضح و ثابتی داشته باشید. خواندن آن اغلب آسان‌تر از یک دسته بلند از بلوک‌های else if است، به خصوص زمانی که هر شاخه صرفاً یک مقدار را اختصاص می‌دهد یا یک تابع واحد را فراخوانی می‌کند.

عملگر سه‌گانه (Ternary Operator)

برای تصمیمات دوتایی کوتاه، عملگر سه‌گانه همه چیز را فشرده نگه می‌دارد. این عملگر سه عملوند می‌گیرد: یک شرط، مقداری در صورت درست بودن، و مقداری در صورت نادرست بودن.

const result = (age >= 18) ? "Eligible" : "Not eligible";

می‌توانید از آن برای انتساب‌های سریع یا بازگشت‌های درون‌خطی (inline returns) استفاده کنید. زمانی که نتیجه یک عبارت ساده باشد، به خوبی کار می‌کند. در برابر وسوسه استفاده از عملگرهای سه‌گانه تو در تو (تا سه سطح) مقاومت کنید. یک عملگر سه‌گانه تو در تو ممکن است باعث صرفه‌جویی در تعداد خطوط شود، اما خوانایی را فدا می‌کند. وقتی منطق شما پیچیده می‌شود، یک بلوک if-else معمولاً برای توسعه‌دهنده بعدی که فایل را باز می‌کند، مهربان‌تر است.

تصمیمات تو در تو

منطق پیچیده گاهی اوقات مستلزم پرسیدن سوالات تکمیلی است. شما می‌توانید برای دقیق‌تر کردن یک تصمیم، یک if را درون if دیگری قرار دهید.

if (weather === "sunny") {
    if (temp > 30) {
        console.log("