فارسی

مقایسه دقیق عملکرد حلقه‌های for، متدهای forEach و map در جاوا اسکریپت، با مثال‌های کاربردی و بهترین موارد استفاده برای توسعه‌دهندگان.

مقایسه عملکرد: حلقه For در مقابل forEach در مقابل Map در جاوا اسکریپت

جاوا اسکریپت چندین راه برای تکرار بر روی آرایه ها ارائه می دهد که هر کدام دارای نحو، عملکرد و مهمتر از همه، ویژگی های عملکردی خاص خود هستند. درک تفاوت بین حلقه های for، forEach و map برای نوشتن کد جاوا اسکریپت کارآمد و بهینه شده، به ویژه هنگام کار با مجموعه داده های بزرگ یا برنامه های کاربردی با عملکرد حیاتی بسیار مهم است. این مقاله یک مقایسه عملکرد جامع ارائه می دهد، به بررسی تفاوت های ظریف هر روش می پردازد و راهنمایی هایی در مورد زمان استفاده از هر کدام ارائه می دهد.

مقدمه: تکرار در جاوا اسکریپت

تکرار بر روی آرایه ها یک وظیفه اساسی در برنامه نویسی است. جاوا اسکریپت روش های مختلفی را برای دستیابی به این هدف ارائه می دهد که هر کدام برای اهداف خاصی طراحی شده اند. ما بر روی سه روش متداول تمرکز خواهیم کرد:

انتخاب روش تکرار مناسب می تواند به طور قابل توجهی بر عملکرد کد شما تأثیر بگذارد. بیایید به بررسی عمیق هر روش بپردازیم و ویژگی های عملکرد آنها را تجزیه و تحلیل کنیم.

for Loop: روش سنتی

حلقه for اساسی ترین و پرکاربردترین ساختار تکرار در جاوا اسکریپت و بسیاری از زبان های برنامه نویسی دیگر است. این حلقه کنترل صریحی بر فرآیند تکرار فراهم می کند.

نحو و کاربرد

نحو یک حلقه for ساده است:


for (let i = 0; i < array.length; i++) {
  // Code to be executed for each element
  console.log(array[i]);
}

در اینجا تجزیه و تحلیل اجزای آن آورده شده است:

ویژگی های عملکرد

حلقه for به طور کلی سریعترین روش تکرار در جاوا اسکریپت در نظر گرفته می شود. این حلقه کمترین سربار را ارائه می دهد زیرا به طور مستقیم شمارنده را دستکاری می کند و با استفاده از اندیس آنها به عناصر آرایه دسترسی پیدا می کند.

مزایای کلیدی:

مثال: پردازش سفارشات از سراسر جهان

تصور کنید که در حال پردازش لیستی از سفارشات از کشورهای مختلف هستید. ممکن است برای اهداف مالیاتی نیاز داشته باشید سفارشات از کشورهای خاص را به طور متفاوتی انجام دهید.


const orders = [
  { id: 1, country: 'USA', amount: 100 },
  { id: 2, country: 'Canada', amount: 50 },
  { id: 3, country: 'UK', amount: 75 },
  { id: 4, country: 'Germany', amount: 120 },
  { id: 5, country: 'USA', amount: 80 }
];

function processOrders(orders) {
  for (let i = 0; i < orders.length; i++) {
    const order = orders[i];
    if (order.country === 'USA') {
      console.log(`Processing USA order ${order.id} with amount ${order.amount}`);
      // Apply USA-specific tax logic
    } else {
      console.log(`Processing order ${order.id} with amount ${order.amount}`);
    }
  }
}

processOrders(orders);

forEach: یک رویکرد کاربردی برای تکرار

forEach یک تابع مرتبه بالاتر است که در آرایه ها در دسترس است و روشی مختصر و کاربردی تر برای تکرار ارائه می دهد. این تابع یک تابع ارائه شده را برای هر عنصر آرایه یک بار اجرا می کند.

نحو و کاربرد

نحو forEach به شرح زیر است:


array.forEach(function(element, index, array) {
  // Code to be executed for each element
  console.log(element, index, array);
});

تابع callback سه آرگومان دریافت می کند:

ویژگی های عملکرد

forEach به طور کلی کندتر از حلقه for است. دلیلش این است که forEach شامل سربار فراخوانی یک تابع برای هر عنصر است که به زمان اجرا اضافه می کند. با این حال، این تفاوت ممکن است برای آرایه های کوچکتر ناچیز باشد.

مزایای کلیدی:

معایب کلیدی:

مثال: قالب بندی تاریخ ها از مناطق مختلف

تصور کنید که آرایه ای از تاریخ ها در یک فرمت استاندارد دارید و باید آنها را مطابق با ترجیحات منطقه ای مختلف قالب بندی کنید.


const dates = [
  '2024-01-15',
  '2023-12-24',
  '2024-02-01'
];

function formatDate(dateString, locale) {
  const date = new Date(dateString);
  return date.toLocaleDateString(locale);
}

function formatDates(dates, locale) {
  dates.forEach(dateString => {
    const formattedDate = formatDate(dateString, locale);
    console.log(`Formatted date (${locale}): ${formattedDate}`);
  });
}

formatDates(dates, 'en-US'); // US format
formatDates(dates, 'en-GB'); // UK format
formatDates(dates, 'de-DE'); // German format

map: تبدیل آرایه ها

map تابع مرتبه بالاتر دیگری است که برای تبدیل آرایه ها طراحی شده است. این تابع یک آرایه جدید با اعمال یک تابع ارائه شده به هر عنصر از آرایه اصلی ایجاد می کند.

نحو و کاربرد

نحو map شبیه به forEach است:


const newArray = array.map(function(element, index, array) {
  // Code to transform each element
  return transformedElement;
});

تابع callback نیز همان سه آرگومان را به عنوان forEach (element، index و array) دریافت می کند، اما باید یک مقدار را برگرداند، که عنصر مربوطه در آرایه جدید خواهد بود.

ویژگی های عملکرد

مشابه forEach، map به دلیل سربار فراخوانی تابع، به طور کلی کندتر از حلقه for است. علاوه بر این، map یک آرایه جدید ایجاد می کند که می تواند حافظه بیشتری مصرف کند. با این حال، برای عملیاتی که نیاز به تبدیل یک آرایه دارند، map می تواند کارآمدتر از ایجاد دستی یک آرایه جدید با حلقه for باشد.

مزایای کلیدی:

معایب کلیدی:

مثال: تبدیل ارزها از کشورهای مختلف به دلار آمریکا

فرض کنید آرایه ای از تراکنش ها در ارزهای مختلف دارید و باید همه آنها را برای اهداف گزارش دهی به دلار آمریکا تبدیل کنید.


const transactions = [
  { id: 1, currency: 'EUR', amount: 100 },
  { id: 2, currency: 'GBP', amount: 50 },
  { id: 3, currency: 'JPY', amount: 7500 },
  { id: 4, currency: 'CAD', amount: 120 }
];

const exchangeRates = {
  'EUR': 1.10, // Example exchange rate
  'GBP': 1.25,
  'JPY': 0.007,
  'CAD': 0.75
};

function convertToUSD(transaction) {
  const rate = exchangeRates[transaction.currency];
  if (rate) {
    return transaction.amount * rate;
  } else {
    return null; // Indicate conversion failure
  }
}

const usdAmounts = transactions.map(transaction => convertToUSD(transaction));

console.log(usdAmounts);

بنچمارک عملکرد

برای مقایسه عینی عملکرد این روش ها، می توانیم از ابزارهای بنچمارک مانند console.time() و console.timeEnd() در جاوا اسکریپت یا کتابخانه های بنچمارک اختصاصی استفاده کنیم. در اینجا یک مثال اساسی آورده شده است:


const arraySize = 100000;
const largeArray = Array.from({ length: arraySize }, (_, i) => i + 1);

// For loop
console.time('For loop');
for (let i = 0; i < largeArray.length; i++) {
  // Do something
  largeArray[i] * 2;
}
console.timeEnd('For loop');

// forEach
console.time('forEach');
largeArray.forEach(element => {
  // Do something
  element * 2;
});
console.timeEnd('forEach');

// Map
console.time('Map');
largeArray.map(element => {
  // Do something
  return element * 2;
});
console.timeEnd('Map');

نتایج مورد انتظار:

در بیشتر موارد، ترتیب عملکرد زیر را مشاهده خواهید کرد (از سریعترین به کندترین):

  1. for loop
  2. forEach
  3. map

ملاحظات مهم:

بهترین شیوه ها و موارد استفاده

انتخاب روش تکرار مناسب بستگی به الزامات خاص کار شما دارد. در اینجا خلاصه ای از بهترین شیوه ها آورده شده است:

سناریوها و مثال های واقعی

در اینجا برخی از سناریوهای واقعی وجود دارد که در آن هر روش تکرار ممکن است مناسب ترین انتخاب باشد:

فراتر از اصول اولیه: سایر روش های تکرار

در حالی که این مقاله بر روی حلقه های for، forEach و map تمرکز دارد، جاوا اسکریپت روش های تکرار دیگری را ارائه می دهد که می توانند در موقعیت های خاص مفید باشند:

نتیجه گیری

درک ویژگی های عملکرد و موارد استفاده از روش های مختلف تکرار در جاوا اسکریپت برای نوشتن کد کارآمد و بهینه شده ضروری است. در حالی که حلقه های for به طور کلی بهترین عملکرد را ارائه می دهند، forEach و map جایگزین های مختصرتر و کاربردی تری را ارائه می دهند که برای بسیاری از سناریوها مناسب هستند. با در نظر گرفتن دقیق الزامات خاص کار خود، می توانید مناسب ترین روش تکرار را انتخاب کنید و کد جاوا اسکریپت خود را برای عملکرد و خوانایی بهینه کنید.

به یاد داشته باشید که کد خود را بنچمارک کنید تا فرضیات عملکرد را تأیید کنید و رویکرد خود را بر اساس زمینه خاص برنامه خود تطبیق دهید. بهترین انتخاب به اندازه مجموعه داده شما، پیچیدگی عملیات انجام شده و اهداف کلی کد شما بستگی دارد.