بازگشت به درس

چند روز قبل کدام روز ماه بود؟

اهمیت: 4

یک تابع getDateAgo(date, days) بسازید که روز ماه را به اندازه days روز قبل از date برگرداند.

برای مثال، اگر امروز 20ام باشد، سپس getDateAgo(new Date(), 1) باید 19ام را برگرداند و getDateAgo(new Date(), 2) باید 18ام باشد.

باید به ازای days=365 یا بیشتر به درستی کار کند:

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)

پی‌نوشت: تابع نباید date داده شده را تغییر دهد.

باز کردن یک sandbox همراه با تست‌ها.

ایده ساده‌ای است: تعداد روز داده شده را از date کم کنید:

function getDateAgo(date, days) {
  date.setDate(date.getDate() - days);
  return date.getDate();
}

…اما تابع نباید date را تغییر دهد. این مهم است چون کد بیرونی که به ما تاریخ را می‌دهد توقع ندارد که تاریخ تغییر کند.

برای پیاده‌سازی آن بیایید از تاریخ یک مشابه بسازیم، مانند این:

function getDateAgo(date, days) {
  let dateCopy = new Date(date);

  dateCopy.setDate(date.getDate() - days);
  return dateCopy.getDate();
}

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)
function getDateAgo(date, days) {
  let dateCopy = new Date(date);

  dateCopy.setDate(date.getDate() - days);
  return dateCopy.getDate();
}

باز کردن راه‌حل همراه با تست‌ها درون یک sandbox.