javascriptArray.prototype.forEach()متد forEach در جاوااسکریپت
forEach در جاوااسکریپت برای انجام یک کار روی اعضای آرایه است. چاپ فهرست با شماره، خروجی undefined و فرق return در callback با توقف حلقه را ببینید.
مفهوم به زبان ساده
گاهی از اعضای آرایه خروجی تازه نمیسازیم و فقط میخواهیم برای هر عضو کاری انجام دهیم؛ مانند چاپ ردیفها، ثبت یک گزارش یا ساخت عناصر صفحه. forEach تابعی را برای هر عضو موجود آرایه فراخوانی میکند. تابع میتواند مقدار عضو و اندیس آن را بگیرد. اندیس از صفر آغاز میشود، پس برای شمارهٔ نمایشی فهرست معمولاً یک واحد به آن اضافه میکنیم.
در مثال، عنوان سه درس را با شماره چاپ میکنیم. callback هیچ نتیجهٔ محاسباتی برای آرایهٔ تازه نمیسازد. نتیجهٔ خود forEach نیز undefined است؛ بنابراین نباید انتظار داشته باشیم متغیر result شامل فهرست تغییرکرده باشد. اگر میخواهید هر عنوان را به رشتهٔ شمارهدار تبدیل کنید و آرایهٔ آنها را نگه دارید، #map برای بیان این هدف مناسبتر است.
return در callback فقط همان فراخوانی callback را پایان میدهد و حلقهٔ forEach را متوقف نمیکند. break و continue هم در بدنهٔ این تابع مثل حلقهٔ معمولی به کار نمیروند. اگر به توقف زودهنگام نیاز دارید، #for-of یا یک روش جستوجوی مناسب را انتخاب کنید. همچنین forEach منتظر Promise برگرداندهشده از callback نمیماند؛ پس برای مراحل ناهمگام، آموختهٔ این مدخل را بیتغییر تعمیم ندهید. نمونهٔ فعلی کاملاً همگام و قابل اجرا در مرورگر و Node.js است.
کجا به کار میآید؟
- انجام یک کار جانبی همگام برای هر عضو، مانند چاپ گزارش
- پیمایش فهرست با دسترسی همزمان به مقدار و اندیس
از تعریف تا یک مثال واقعی
const lessons = ['متغیر', 'شرط', 'تابع'];
const result = lessons.forEach((title, index) => {
console.log(`${index + 1}. ${title}`);
});
console.log(result);
1. متغیر 2. شرط 3. تابع undefined
این مثال چطور کار میکند؟
forEach عنوان هر درس و اندیس آن را به callback میدهد.
برای شمارهٔ انسانی، یک واحد به اندیس صفرمبنا اضافه میکنیم.
سه پیام به ترتیب اعضای آرایه چاپ میشوند.
نتیجهٔ خود forEach برابر undefined است؛ result آرایه نیست.
اشتباه رایج
return از callback، forEach را نمیشکند. استفاده از callback با async نیز باعث نمیشود forEach منتظر پایان آن کارها بماند؛ ترتیب و انتظار ناهمگام را جدا طراحی کنید.
این را به خاطر بسپارید
برای «انجام کار برای هر عضو» از forEach استفاده کنید؛ برای «ساخت آرایهٔ نتیجه» معمولاً map را انتخاب کنید.