کنترل جریان
شرط if/else، switch/case، عملگر سهتایی و ارزیابی کوتاهمدار برای تصمیمگیری در کد
کنترل جریان چیست؟
بهطور پیشفرض، جاوا اسکریپت کد را از بالا به پایین و خط به خط اجرا میکند. اما گاهی نیاز داریم:
- کدی فقط در شرط خاصی اجرا شود → شرطها
- کدی چند بار تکرار شود → حلقهها
- از جایی پرش کنیم → break و continue
به این «تصمیمگیریها و تغییر مسیر اجرا» کنترل جریان (Control Flow) میگویند.
شرط if
سادهترین ساختار شرطی — کد داخل بلاک فقط وقتی اجرا میشود که شرط truthy باشد:
if (شرط) {
// اگر شرط درست باشد اجرا میشود
}
// مثال:
const age = 20;
if (age >= 18) {
console.log("شما بزرگسال هستید");
}
شرط else
اگر شرط if نادرست باشد، بلاک else اجرا میشود:
const age = 15;
if (age >= 18) {
console.log("بزرگسال");
} else {
console.log("کودک"); // این اجرا میشود
}
شرط else if
برای بررسی چند شرط پشت سر هم:
const score = 85;
if (score >= 90) {
console.log("عالی (A)");
} else if (score >= 80) {
console.log("خوب (B)"); // این اجرا میشود
} else if (score >= 70) {
console.log("متوسط (C)");
} else {
console.log("نیاز به تلاش");
}
نکته: جاوا اسکریپت شرطها را از بالا بررسی میکند و به محض برقراری یکی، بقیه را بررسی نمیکند.
شرطهای تو در تو
میتوان شرطها را داخل هم قرار داد — اما برای خوانایی از تو در تو زیاد پرهیز کنید:
const age = 25;
const hasLicense = true;
if (age >= 18) {
if (hasLicense) {
console.log("میتوانید رانندگی کنید");
} else {
console.log("اول گواهی بگیرید");
}
} else {
console.log("سن شما کافی نیست");
}
// بهتر: با && ترکیب کنید
if (age >= 18 && hasLicense) {
console.log("میتوانید رانندگی کنید");
}
switch
وقتی میخواهید یک متغیر را با چند مقدار مشخص مقایسه کنید، switch خواناتر است:
const fruit = "سیب";
switch (fruit) {
case "موز":
console.log("زرد");
break;
case "سیب":
console.log("قرمز"); // اجرا میشود
break;
case "پرتقال":
console.log("نارنجی");
break;
default:
console.log("ناشناخته");
}
مفهوم case
هر case یک حالت ممکن را بررسی میکند. مقایسه در switch از نوع سختگیرانه (===) است.
مفهوم default
اگر هیچ caseای مطابقت نداشته باشد اجرا میشود — مانند else در if.
نقش break
بدون break، اجرا از case مطابقتیافته به caseهای بعدی سرریز (Fall-Through) میکند:
switch (2) {
case 1:
console.log("یک");
case 2:
console.log("دو"); // اجرا میشود
case 3:
console.log("سه"); // سرریز! این هم اجرا میشود
break;
case 4:
console.log("چهار"); // دیگر نه (break شده)
}
گروهبندی caseها
switch (day) {
case "شنبه":
case "یکشنبه":
case "دوشنبه":
console.log("ابتدای هفته");
break;
case "پنجشنبه":
case "جمعه":
console.log("آخر هفته");
break;
}
switch در برابر if/else
| ویژگی | switch | if/else |
|---|---|---|
| نوع مقایسه | فقط === با مقادیر ثابت | هر عبارتی |
| خوانایی | برای بسیاری از مقادیر بهتر | برای شرطهای پیچیده بهتر |
| محدوده (Range) | پشتیبانی نمیشود | پشتیبانی میشود |
عملگر سهتایی (Ternary)
نسخه فشرده if/else که یک عبارت است (مقدار تولید میکند):
// ساختار: شرط ? مقدار درست : مقدار نادرست
const age = 20;
const status = age >= 18 ? "بزرگسال" : "کودک";
// در console.log:
console.log(score > 50 ? "قبول" : "مردود");
// تو در تو (با احتیاط!):
const grade = score >= 90 ? "A"
: score >= 80 ? "B"
: score >= 70 ? "C"
: "F";
ارزیابی کوتاهمدار (Short-Circuit)
روشی برای اجرای شرطی کد بدون if:
// && — «اگر اولی درست است، دومی را اجرا کن»
isLoggedIn && console.log("خوش آمدید");
// || — «اگر اولی نادرست است، دومی را استفاده کن»
const name = userInput || "مهمان";
// ?? — «فقط اگر null/undefined بود»
const count = data ?? 0;
اشتباهات رایج
// ۱. سمیکالن لازم نیست بعد از بلاک:
if (x > 0) {
console.log("مثبت");
}
// ۲. بلاک بدون آکولاد فقط یک دستور میگیرد:
if (x > 0)
console.log("مثبت");
console.log("این همیشه اجرا میشود!"); // خطای منطقی رایج!
// ۳. انتساب در شرط (اشتباه رایج):
if (x = 5) { } // همیشه درست! باید === بود
جمعبندی
- if/else برای شرطهای عمومی و switch برای مقایسه با مقادیر ثابت
- switch از مقایسه سختگیرانه استفاده میکند
- break از سرریز caseها جلوگیری میکند
- عملگر سهتایی برای شرطهای ساده و تکخطی
- ارزیابی کوتاهمدار کد را فشردهتر میکند
این مبحث بخشی از دوره آموزش کامل جاوا اسکریپت است.