برنامهها برای پردازش داده طراحی شدهاند، و الگوهای تکرار نقش مهمی در خوانایی و ساختار کد دارند. الگوی iterator روشی استاندارد برای پردازش تدریجی دادههاست — بهجای پردازش کل مجموعه، دادهها را یکبهیک دریافت و بررسی میکنیم.
الگوی iterator ساختاری دارد که به منبع داده متصل است و متدی به نام next() ارائه میدهد. هر بار فراخوانی next() یک مقدار جدید و وضعیت پایان را بازمیگرداند:
{ value: ..., done: false }وقتی done برابر true شود، تکرار پایان یافته است.
ES6 حلقه for..of را معرفی کرد که مصرفکنندهٔ استاندارد iteratorهاست:
for (let val of it) {
console.log(`Iterator value: ${val}`);
}این روش خواناتر و سادهتر از حلقههای دستی است.
عملگر ... نیز برای مصرف iterator استفاده میشود — در آرایه یا لیست آرگومان تابع:
var vals = [ ...it ];
doSomethingUseful(...it);در هر دو حالت، مقادیر از iterator استخراج و در ساختار مقصد قرار میگیرند.
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 بهصورت پیشفرض روی 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 و عملگر ... راههای ساده و قدرتمندی برای مصرف دادهها هستند. شناخت این الگوها پایهای مهم برای نوشتن کدهای مدرن و قابلنگهداری است.