در این درس میخوانید
در یک سامانهٔ آموزشی، گاهی باید بر اساس نمره پیام نشان دهیم و گاهی برای چند نمره یک محاسبه انجام دهیم. شرط مسیر اجرا را انتخاب میکند و حلقه یک کار را تکرار میکند. اگر مسئله را پیش از کدنویسی به زبان ساده بنویسید، انتخاب ابزار آسانتر میشود: «اگر نمره معتبر بود، وضعیت را تعیین کن؛ برای هر نمرهٔ معتبر، مجموع را افزایش بده». نمونههای این درس پنجم در Console یا فایل مستقل قابل اجرا هستند.
شرط if و ترتیب تصمیمها
عبارت شرط باید داخل پرانتز قرار گیرد و ما برای بدنه، حتی در مثال کوتاه، آکولاد میگذاریم. if یک مسیر، else if یک حالت بعدی و else حالت باقیمانده را اجرا میکند. ترتیب بررسی مهم است: ابتدا دادهٔ نامعتبر را جدا کنید و بعد سراغ دستهبندی بروید. مقایسه با === انجام میشود؛ نوشتن = داخل شرط، انتساب است و میتواند منطق برنامه را عوض کند.
const score = 16;
if (!Number.isFinite(score) || score < 0 || score > 20) {
console.log("نمره نامعتبر است");
} else if (score >= 10) {
console.log("قبول");
} else {
console.log("نیاز به تمرین بیشتر");
}در این مثال، ابتدا دامنهٔ معتبر صفر تا بیست را مشخص کردهایم. اگر نمره دقیقاً 10 باشد، در مسیر قبول قرار میگیرد. با آزمایش مقدارهای 0، 10، 20 و 21 مرزهای تصمیم را بررسی کنید؛ آزمایش فقط یک نمرهٔ میانی کافی نیست. شرط سهتایی برای انتخاب کوتاه یک مقدار مفید است، اما چند شرط تودرتوی طولانی را به عبارت فشرده تبدیل نکنید؛ خواننده باید مسیر اجرا را دنبال کند.
switch برای انتخابهای مشخص
const status = "published";
switch (status) {
case "draft":
console.log("پیشنویس");
break;
case "published":
console.log("منتشرشده");
break;
default:
console.log("وضعیت ناشناخته");
}switch برای حالتهایی مانند وضعیت ثابت مطلب مناسب است. break در این نمونه جلوی ادامهٔ ناخواسته به case بعدی را میگیرد. مقدارهای case با مقایسهٔ دقیق بررسی میشوند، بنابراین رشتهٔ «1» همان عدد 1 نیست. اگر مسئله دربارهٔ بازهها، چند شرط ترکیبی یا اعتبارسنجی است، if معمولاً مستقیمتر است. ابزار را از روی شکل مسئله انتخاب کنید، نه صرفاً برای متنوعکردن کد.
for؛ شروع، شرط ادامه و تغییر شمارنده
let totalMinutes = 0;
for (let day = 1; day <= 3; day += 1) {
totalMinutes += 20;
}
console.log(totalMinutes); // 60این حلقه از روز اول شروع میکند، تا زمانی که day از 3 بیشتر نشده ادامه میدهد و پس از هر دور شمارنده را افزایش میدهد. اشتباه day < 3 فقط دو دور اجرا میکند؛ این نوع خطا را off-by-one مینامند. برای فهم حلقه، نخست دو دور را دستی روی کاغذ اجرا کنید. تغییر شمارنده یا شرط پایان را طوری ننویسید که هیچوقت به پایان نرسد؛ حلقهٔ طولانی میتواند رابط مرورگر را بیپاسخ کند.
for...of مقدارها را میخواند
آرایه یک فهرست مرتب از مقدارهاست و در درس بعدی آرایهها آن را عمیقتر بررسی میکنیم. فعلاً برای پیمایش نمرههای یک فهرست از for...of استفاده میکنیم. for...in برای کلیدهای قابل شمارش است و جایگزین معمول پیمایش مقدارهای آرایه نیست. break کل حلقه را متوقف میکند و continue فقط باقی همان دور را کنار میگذارد. در مثال زیر، نمرهٔ نامعتبر در میانگین وارد نمیشود.
const scores = [14, 18, -2, 16];
let sum = 0;
let validCount = 0;
for (const value of scores) {
if (!Number.isFinite(value) || value < 0 || value > 20) continue;
sum += value;
validCount += 1;
}
const average = validCount > 0 ? sum / validCount : null;
console.log(average); // 16while را چه وقت انتخاب کنیم؟
وقتی تعداد دورها از ابتدا مشخص نیست، while میتواند مناسب باشد، به شرط اینکه مسیر تغییر وضعیت و توقف روشن باشد. مثلاً تا وقتی یک صف کار دارد، یک عضو را پردازش میکنیم. در مثالهای ابتدایی از ساختن انتظار فعال برای شبکه یا زمان پرهیز کنید؛ حلقهٔ while جایگزین API ناهمگام نیست. همچنین خروج با break باید دلیل روشن داشته باشد و پوشاندن یک حلقهٔ بیپایان با چند شرط پراکنده، نگهداری را سخت میکند.
تمرین: بودجهٔ زمان مطالعه
فهرست [15, 0, 30, 20] زمان مطالعهٔ چهار روز است. زمانهای صفر را کنار بگذارید، مجموع زمان مثبت را حساب کنید و تعداد روزهای فعال را نشان دهید. خروجی باید مجموع 65 و سه روز فعال باشد. سپس یک عدد منفی به فهرست اضافه کنید و قاعدهٔ برخورد با آن را توضیح دهید. پاسخ زیر فقط مقدارهای متناهی و مثبت را میپذیرد.
const studyMinutes = [15, 0, 30, 20];
let activeDays = 0;
let total = 0;
for (const minutes of studyMinutes) {
if (!Number.isFinite(minutes) || minutes <= 0) continue;
activeDays += 1;
total += minutes;
}
console.log(total, activeDays); // 65 3مرور پیش از ادامه
- شرط را با مقدارهای مرزی و نامعتبر آزمایش کنید.
- بین = و === تفاوت بگذارید و برای بدنه آکولاد بگذارید.
- قبل از اجرای حلقه، شرط پایان را توضیح دهید.
- برای مقدارهای آرایه، for...of معمولاً انتخاب روشنتری از for...in است.
- برای فهرست خالی، تقسیم بر صفر و حالت بدون نتیجه تصمیم بگیرید.
منابع انگلیسی
- MDN — Control flow and error handling
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling
- MDN — Loops and iteration
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Loops_and_iteration
مثالهای نمره و زمان مطالعه برای این مسیر تدوین شدهاند. در درس بعد، همین منطق را داخل تابعهای قابل استفادهٔ دوباره قرار میدهیم.
پیشنیاز و محیط اجرای مثالها
درس 5 از ۲۰؛ پیشنیاز: درسهای قبلی مجموعه. کدهای مستقل این درس در Console تازهٔ مرورگر یا فایل JavaScript اجرا میشوند؛ نمونهها را جداگانه آزمایش کنید.
پیشرفت روی همین مرورگر ذخیره میشود.