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

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

iteratoriterablefor..ofspread

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۲۸ مهر ۱۴۰۴

مقدمه


برنامه‌ها برای پردازش داده طراحی شده‌اند، و الگوهای تکرار نقش مهمی در خوانایی و ساختار کد دارند. الگوی 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 و عملگر ... راه‌های ساده و قدرتمندی برای مصرف داده‌ها هستند. شناخت این الگوها پایه‌ای مهم برای نوشتن کدهای مدرن و قابل‌نگهداری است.


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

مقالات مرتبط

نحوهٔ میزبانی مستقل اپلیکیشن Next.js – پیکربندی، کشینگ، و استراتژی‌های استقرار

nextjs-self-hosting-deployment-cache-isr-proxy-env

ادامه

مقایسه‌های شرطی تبدیل‌پذیر و کلاس‌های پروتوتایپی در جاوااسکریپت – درک دقیق رفتار شرطی و ساختارهای ارث‌بری

این مقاله دو موضوع مهم از ضمیمهٔ A کتاب YDKJSY را بررسی می‌کند: نحوهٔ تبدیل نوع در عبارات شرطی مانند if و while، و الگوی کلاس‌های پروتوتایپی به‌عنوان پیش‌زمینه‌ای برای کلاس‌های ES6. با مثال‌های عملی، تفاوت بین مقایسه‌های دقیق و تبدیل‌پذیر، و نحوهٔ تفویض رفتار از طریق زنجیرهٔ پروتوتایپ روشن می‌شود.

ادامه

در جاوااسکریپت – تفاوت مقدار و مرجع، و فرم‌های متنوع تعریف تابع

در جاوااسکریپت – تفاوت مقدار و مرجع، و فرم‌های متنوع تعریف تابع

ادامه

پروتوتایپ‌ها در جاوااسکریپت – زنجیرهٔ ارجاع، تفویض ویژگی‌ها، و نقش this در رفتار پویا

پروتوتایپ‌ها در جاوااسکریپت مکانیزمی برای ارجاع ویژگی‌ها بین اشیاء هستند. این مقاله به تعریف زنجیرهٔ پروتوتایپ، نحوهٔ تفویض ویژگی‌ها، تفاوت بین دسترسی و انتساب، و نقش کلیدی this در فراخوانی متدهای ارجاع‌شده می‌پردازد. درک این مفاهیم برای طراحی شی‌گرا و رفتارهای پویا در JS ضروری است.

ادامه

Closure و this در جاوااسکریپت – حافظهٔ دامنه و زمینهٔ اجرایی در توابع

Closure و this دو مفهوم بنیادی و گاه گیج‌کننده در جاوااسکریپت هستند. این مقاله به تعریف دقیق closure به‌عنوان حافظهٔ متغیرهای بیرونی در توابع، و بررسی رفتار پویا و وابسته به نحوهٔ فراخوانی در this می‌پردازد. با مثال‌های عملی، تفاوت بین دامنهٔ ثابت و زمینهٔ اجرایی پویا روشن می‌شود.

ادامه

ماژول‌ها در جاوااسکریپت – از الگوی کلاسیک تا ES Modules و تفاوت‌های ساختاری

ماژول‌ها در جاوااسکریپت مانند کلاس‌ها برای گروه‌بندی داده و رفتار در واحدهای منطقی طراحی شده‌اند. این مقاله به بررسی الگوی کلاسیک ماژول‌ها با توابع کارخانه‌ای، تفاوت آن با کلاس‌ها، و معرفی ES Modules در ES6 می‌پردازد. همچنین به نحوهٔ استفاده، صادرات، و وارد کردن ماژول‌ها و تفاوت در نمونه‌سازی اشاره می‌شو

ادامه