تماس با ما

کنترل جریان: شرط‌ها و حلقه‌ها

کنترل جریان: شرط‌ها و حلقه‌ها؛ آموزش JavaScript به زبان ساده، همراه با مثال و خروجی.

if / else if / else

const score = 85;

if (score >= 90) {
  console.log("عالی");
} else if (score >= 70) {
  console.log("خوب");   // ← این اجرا می‌شه
} else {
  console.log("تلاش بیشتر");
}

بدون آکولاد فقط یک دستور بعدی رو کنترل می‌کنه (توصیه نمی‌شه):

if (score > 50) console.log("قبول");

Early return (Guard Clause)

به جای تو در تو کردن، زود خارج شو:

function process(user) {
  if (!user) return "کاربر نیست";
  if (!user.active) return "غیرفعال";
  return "OK";
}

switch

const day = 3;
switch (day) {
  case 1:
    console.log("شنبه");
    break;
  case 2:
  case 3:                    // fall-through برای چند case
    console.log("یکشنبه یا دوشنبه");
    break;
  default:
    console.log("نامعتبر");
}
// → یکشنبه یا دوشنبه

بدون break اجرا به case بعدی می‌ره (fall-through).

الگوی switch(true):

const n = 15;
switch (true) {
  case n < 10: console.log("کوچک"); break;
  case n < 20: console.log("متوسط"); break;   // ← این
  default: console.log("بزرگ");
}

جایگزین ساده‌تر: object lookup

const names = { 1: "شنبه", 2: "یکشنبه" };
console.log(names[2] ?? "نامعتبر"); // → یکشنبه

حلقه‌ها

for

for (let i = 0; i < 3; i++) {
  console.log(i);   // → 0, 1, 2
}

ساختار: for (مقداردهی اولیه; شرط; گام).

while

let n = 3;
while (n > 0) {
  console.log(n);   // → 3, 2, 1
  n--;
}

do...while

حداقل یک بار اجرا می‌شه:

let k = 10;
do {
  console.log(k);   // → 10 (فقط یک بار)
  k++;
} while (k < 5);

for...of (مقادیر)

روی هر iterable (آرایه، رشته، Map، Set):

for (const ch of "abc") console.log(ch);        // → a, b, c
for (const x of [10, 20]) console.log(x);       // → 10, 20

// با index:
for (const [i, v] of ["a", "b"].entries()) {
  console.log(i, v);   // → 0 a ، 1 b
}

for...in (کلیدها)

روی کلیدهای object (برای آرایه توصیه نمی‌شه):

const user = { name: "Ali", age: 30 };
for (const key in user) {
  console.log(key, user[key]);  // → name Ali ، age 30
}

for...in کلیدهای ارث‌برده‌شده (inherited) رو هم می‌گیره. برای فقط کلیدهای خودی: Object.keys(obj) یا Object.hasOwn(obj, key).

break و continue

for (let i = 0; i < 10; i++) {
  if (i === 2) continue;   // این دور رو رد کن
  if (i === 5) break;      // کل حلقه رو تمام کن
  console.log(i);          // → 0, 1, 3, 4
}

Label

خروج از حلقه‌ی تو در تو:

outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    if (j === 1) continue outer;
    if (i === 2) break outer;
    console.log(i, j);   // → 0 0 ، 1 0
  }
}

حلقه‌های مدرن (متدهای آرایه)

[1, 2, 3].forEach((n) => console.log(n * 2));   // → 2, 4, 6

جزئیات: Array methods.

الگوهای رایج

جمع اعداد

let sum = 0;
for (const n of [1, 2, 3, 4]) sum += n;
console.log(sum); // → 10

پیدا کردن بزرگ‌ترین

const arr = [4, 9, 2];
let max = -Infinity;
for (const n of arr) if (n > max) max = n;
console.log(max); // → 9

FizzBuzz

for (let i = 1; i <= 15; i++) {
  if (i % 15 === 0) console.log("FizzBuzz");
  else if (i % 3 === 0) console.log("Fizz");
  else if (i % 5 === 0) console.log("Buzz");
  else console.log(i);
}

حلقه‌ی بی‌نهایت با خروج

let tries = 0;
while (true) {
  tries++;
  if (tries >= 3) break;
}

نکته‌ی let در حلقه

هر دور یک let جدا داره، برخلاف var:

const fnsLet = [];
for (let i = 0; i < 3; i++) fnsLet.push(() => i);
fnsLet.map((f) => f());   // → [0, 1, 2]

const fnsVar = [];
for (var j = 0; j < 3; j++) fnsVar.push(() => j);
fnsVar.map((f) => f());   // → [3, 3, 3]

ایده‌ای دارید؟ برایمان بگویید

مشاوره و پیشنهاد اولیه رایگان است.

تماس با ما