تکرار در جاوااسکریپت – الگوی Iterator، ساختارهای قابل‌تکرار، و مصرف استاندارد داده‌ها

تکرار در جاوااسکریپت – الگوی Iterator، ساختارهای قابل‌تکرار، و مصرف استاندارد داده‌ها

iteratoriterablefor..ofspread

~2 دقیقه مطالعه • بروزرسانی ۲۸ مهر ۱۴۰۴

مقدمه


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


الگوی Iterator


الگوی iterator ساختاری دارد که به منبع داده متصل است و متدی به نام next() ارائه می‌دهد. هر بار فراخوانی next() یک مقدار جدید و وضعیت پایان را بازمی‌گرداند:


{ value: ..., done: false }

وقتی done برابر true شود، تکرار پایان یافته است.


مصرف Iterator با for..of


ES6 حلقه for..of را معرفی کرد که مصرف‌کنندهٔ استاندارد iteratorهاست:


for (let val of it) {
  console.log(`Iterator value: ${val}`);
}

این روش خواناتر و ساده‌تر از حلقه‌های دستی است.


مصرف Iterator با عملگر Spread


عملگر ... نیز برای مصرف iterator استفاده می‌شود — در آرایه یا لیست آرگومان تابع:


var vals = [ ...it ];
doSomethingUseful(...it);

در هر دو حالت، مقادیر از iterator استخراج و در ساختار مقصد قرار می‌گیرند.


Iterable چیست؟


Iterable ساختاری‌ست که می‌توان از آن iterator ساخت. هر بار مصرف، یک نمونهٔ جدید از iterator ایجاد می‌شود. ساختارهای پایه مانند Array، String، Map و Set در ES6 به‌صورت iterable تعریف شده‌اند.


مثال‌هایی از تکرار


var arr = [10, 20, 30];
for (let val of arr) {
  console.log(`Array value: ${val}`);
}

var greeting = "Hello world!";
var chars = [ ...greeting ];
// ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]

تکرار در Map


Map به‌صورت پیش‌فرض روی entries تکرار می‌کند — یعنی زوج‌های [کلید، مقدار]:


for (let [btn, btnName] of buttonNames) {
  btn.addEventListener("click", () => {
    console.log(`Clicked ${btnName}`);
  });
}

تکرار سفارشی


می‌توان از متدهای keys()، values() و entries() برای کنترل نوع تکرار استفاده کرد:


for (let btnName of buttonNames.values()) {
  console.log(btnName);
}

for (let [idx, val] of arr.entries()) {
  console.log(`[${idx}]: ${val}`);
}

استانداردسازی تکرار


با پیروی از پروتکل تکرار، می‌توان ساختارهای دادهٔ سفارشی را قابل‌مصرف با for..of و ... کرد. این کار باعث خوانایی بیشتر و سازگاری بهتر کد می‌شود.


جمع‌بندی


تکرار در جاوااسکریپت با الگوی iterator و ساختارهای iterable استاندارد شده است. استفاده از حلقه for..of و عملگر ... راه‌های ساده و قدرتمندی برای مصرف داده‌ها هستند. شناخت این الگوها پایه‌ای مهم برای نوشتن کدهای مدرن و قابل‌نگهداری است.


نوشته و پژوهش شده توسط دکتر شاهین صیامی