در حال بارگذاری...

حلقه‌های for...of و for...in

در for و while خودتان شمارنده را جلو می‌بردید. خیلی وقت‌ها داده از قبل یک فهرست یا شیء است — می‌خواهید هر مقدار را ببینید، یا هر کلید را، نه ایندکس دست‌ساز. for...of مقدار بعدی را از یک iterable می‌دهد. for...in کلید بعدی را روی یک شیء می‌دهد. همان خانوادهٔ «کار را تکرار کن»؛ چیزی که داخل متغیر حلقه می‌نشیند فرق دارد.

for...of چه کار می‌کند؟

برای هر مقدار داخل یک iterable یک‌بار بدنه را اجرا می‌کند. برای مبتدی، آرایه و رشته روزمره‌ترین‌اند. می‌نویسید for (const item of list) — هر دور، item همان مقدار بعدی است. مگر این‌که عمداً حلقهٔ ایندکسی بخواهید، دیگر i < list.length نمی‌نویسید.

for...of و for...in و حلقه‌های کلاسیک

📊 شکل‌های روزمرهٔ پیمایش

شکل متغیر حلقه چه دارد کی جور است
for...of یک مقدار از iterable هر میوه در آرایه؛ هر حرف در رشته
for...in یک کلید (نام ویژگی) روی شیء هر نام فیلد روی شیء ساده
for کلاسیک یک ایندکس که خودتان کنترل می‌کنید وقتی عدد 0 و 1 و 2 لازم است
while هر چه داخل بدنه به‌روز کنید تا وقتی یک قاعده برقرار است

برای for...of اول با آرایه شروع کنید. وقتی داستان «هر نام ویژگی روی این شیء» است سراغ for...in بروید. وقتی خودِ ایندکس مهم است، for کلاسیک بماند.

for...of روی آرایه

javascript
const colors = ["red", "green", "blue"];
for (const color of colors) {
console.log(color);
}

مقدارهای آرایه را یکی‌یکی ببینید

هر دور یک رشته چاپ می‌شود: red بعد green بعد blue. متغیر حلقه خودِ مقدار است — نه 0 و 1 و 2. اگر فقط آیتم‌ها را می‌خواهید، for...of کوتاه‌تر از مدیریت ایندکس است.

for...of روی رشته

javascript
const word = "hi";
for (const ch of word) {
console.log(ch);
}

حرف‌های یک رشته را پیمایش کنید

رشته هم iterable است. اول h چاپ می‌شود، بعد i. هر کاراکتر یک مقدار است — برای کار حرف‌به‌حرف ساده، قبل از APIهای سنگین‌تر رشته، مفید است.

for...in روی شیء

javascript
const user = { name: "Ada", role: "dev" };
for (const key in user) {
console.log(key + "=" + user[key]);
}

با for...in کلیدها را ببینید

اینجا key اول "name" می‌شود، بعد "role". مقدار را با user[key] می‌خوانید. برای کلیدهای enumerable شیء ساده، for...in را ترجیح بدهید. برای خواندن مقدارهای آرایه اولین ابزارتان نباشد — آن کار for...of است.

قانون کوتاه را یادتان بماند: of → مقدار، in → کلید. قاطی کردن همین دو تا دام کلاسیک مبتدی است.

چسباندن مقدارها با for...of

javascript
const parts = ["A", "B", "C"];
let msg = "";
for (const p of parts) {
msg = msg + p + "-";
}
console.log(msg.slice(0, -1));

از مقدارها یک پیام بسازید

هر دور یک حرف و یک خط تیره اضافه می‌کند. بعد از حلقه slice خط تیرهٔ آخر را برمی‌دارد و A-B-C می‌بینید. همان ایدهٔ چسباندن درس‌های قبلی حلقه — حالا پیمایش مستقیم روی مقدار است.

حلقهٔ ایندکسی هنوز به درد می‌خورد

javascript
const nums = [10, 20, 30];
for (let i = 0; i < nums.length; i++) {
console.log("i=" + i + " value=" + nums[i]);
}
for (const n of nums) {
console.log("value=" + n);
}

کی حلقهٔ ایندکسی هنوز کمک می‌کند؟

for کلاسیک هم ایندکس را چاپ می‌کند هم مقدار را. for...of فقط مقدارها را. شمارهٔ جایگاه لازم است؟ همان for ایندکسی را نگه دارید. فقط آیتم‌ها را می‌خواهید؟ for...of را ترجیح بدهید.

نتیجهٔ for...of را روی صفحه نشان دهید

با for...of روی آرایه راه بروید، یک خط کوتاه بسازید، داخل صفحه بنویسید.

فهرست صفحه با for...of

html
<!DOCTYPE html>
<html>
<head>
<title>for...of — page list</title>
</head>
<body>
<p id="out">…</p>
<script>
const items = ["tea", "milk", "honey"];
let line = "";
for (const item of items) {
line = line + item + " ";
}
let box = document.getElementById("out");
box.textContent = "list=" + line.trim();
</script>
</body>
</html>

صفحه list=tea milk honey را نشان می‌دهد. یکی از آیتم‌های آرایه را عوض کنید، رفرش کنید، خط تازه را بخوانید. برای مقدار for...of، برای کلید شیء for...in، و وقتی ایندکس مهم است for کلاسیک. جلسهٔ بعد با break و continue حلقه را وسط راه هدایت می‌کند.

خودتان امتحان کنید

  1. با for...of هر مقدار ["a", "b", "c"] را لاگ کنید.
  2. با for...of هر حرف "ok" را لاگ کنید.
  3. روی { x: 1, y: 2 } با for...in بنویسید key=value.
  4. با for...of آرایهٔ ["1", "2", "3"] را به 1-2-3 بچسبانید.
  5. یک for ایندکسی بنویسید که ایندکس و مقدار را کنار هم چاپ کند.
  6. در دموی HTML فقط آرایه را عوض کنید، رفرش کنید، list= را بخوانید.

اشتباه‌های رایج

  • نوشتن for...in وقتی منظورتان مقدارهای آرایه بوده (for...of)
  • زدن for...of روی شیء ساده (برای مبتدی آن شیء آن‌طور iterable نیست)
  • انتظار ایندکس 0 و 1 و 2 از for...of — مقدار می‌دهد، نه ایندکس
  • بعد از for...in فراموش کردن user[key] و فقط کلید را لاگ کردن وقتی مقدار هم لازم بوده
  • حلقهٔ ایندکسی بلند وقتی یک for...of روشن خواناتر است

خلاصه

  • for...of روی مقدارهای iterable راه می‌رود (آرایه، رشته)
  • for...in روی کلیدهای شیء راه می‌رود
  • وقتی شمارهٔ ایندکس لازم است، for کلاسیک هنوز جایش است
  • برای یک شرط ادامه‌دار، while هنوز جایش است
  • پیام را با چسباندن مقدارها داخل بدنه بسازید
  • بعدی: break و continue — توقف یا رد کردن یک دور

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
8
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود