3 نکته مهم حلقه‌های forEach در جاوااسکریپت
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 2 دقیقه

3 نکته مهم حلقه‌های forEach در جاوااسکریپت

شاید واقعا فکر کنید که همه چیز را در ارتباط با حلقه‌های forEach در جاوااسکریپت می‌دانید. خب منم همین فکر را داشتم تا اینکه کلمات کلیدی مانند break، return و continue را در یک حلقه مشاهده کردم.

امروز قصد دارم به عنوان یک نکته کوچک به شما در ارتباط با این سه کلمه کلیدی در یک حلقه توضیحاتی ارائه دهم.

۱. کلمه کلیدی return حلقه را متوقف نمی‌کند

فکر می‌کنید که حلقه زیر اعداد ۱ و ۲ را چاپ کرده و متوقف می‌شود؟

array = [1, 2, 3, 4];
array.forEach(function (element) {
  console.log(element);
  
  if (element === 2) 
    return;
  
});
// Output: 1 2 3 4

اینگونه نیست. اگر قبلا با زبانی مانند جاوا کار کرده باشید ممکن است از خودتان بپرسید که چگونه چنین چیزی ممکن است.

دلیل این اتفاق در جاوااسکریپت این است که ما یک تابع callback را در داخل تابع forEach قرار داده‌ایم که به این معناست درست مانند یک تابع عادی برخورد کرده و روی تمام المان‌ها اجرا می‌شود. بنابراین نمی‌توان حلقه را روی یک المان خاص نگه‌داشت.

مطابق با تعریفی که MDN ارائه کرده:

هیچ راهی برای متوقف کردن یک حلقه forEach بجز قرار گرفتن یک استثنا در آن نیست. اگر قصد دارید که در حلقه قابلیت break داشته باشید نیاز است که از یک ساختار دیگر بجز forEach استفاده کنید. 

اگر همین حالت را به شکل دیگری پیاده‌سازی کنیم:

const array = [1, 2, 3, 4];
const callback = function(element) {
    console.log(element);
    
    if (element === 2) 
      return; // would this make a difference? no.
}
for (let i = 0; i < array.length; i++) {
    callback(array[i]);
}
// Output: 1 2 3 4

باز هم کلمه کلیدی return کار خاصی را انجام نمی‌دهد چرا که ما یک تابع را روی هر المان در هر تکرار اعمال کرده‌ایم.

۲. شما نمی‌توانید break کنید

نظرتان در مورد کدهای زیر چیست؟ آیا break باعث متوقف کردن forEach می‌شود؟

const array = [1, 2, 3, 4];
array.forEach(function(element) {
  console.log(element);
  
  if (element === 2) 
    break;
});
// Output: Uncaught SyntaxError: Illegal break statement

در این حالت برنامه حتی اجرا نمی‌شود چرا که دستور break به صورت تکنیکی متعلق به یک حلقه نیست. 

راه حل؟

از یک حلقه عادی for استفاده کنید. اینگونه کسی با کدهای شما مشکلی ندارد:

const array = [1, 2, 3, 4];
for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
  
  if (array[i] === 2) 
    break;
}
// Output: 1 2

۳. در ارتباط با کلمه کلیدی continue چه؟

انتظار دارید که کدهای زیر مقدار ۲ را نادیده گرفته و بقیه آرایه را چاپ کند؟

const array = [1, 2, 3, 4];
array.forEach(function (element) {
  if (element === 2) 
    continue;
  
  console.log(element);
});
// Output: Uncaught SyntaxError: Illegal continue statement: no surrounding iteration statement

خیر، چرا که درست مانند break دستور continue به این شکل متعلق به حلقه forEach نیست.

راه‌حل این حالت نیز درست مانند گزینه قبلی است: از یک حلقه ساده for استفاده کنید:

for (let i = 0; i < array.length; i++) {
  if (array[i] === 2) 
    continue;
  
  console.log(array[i]);
}
// Output: 1 3 4

این هم از مطلب کوتاه ما، امیدوارم نکته‌های ماجرا را گرفته باشید.

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
5 از 1 رای

/@arastoo
ارسطو عباسی
کارشناس تولید و بهینه‌سازی محتوا

کارشناس ارشد تولید و بهینه‌سازی محتوا و تکنیکال رایتینگ - https://arastoo.net

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید