Объявление let и манипуляции с датами

Раздел: JavaScript -> Работа с датами

Объявление let при работе с датами в JavaScript

Переменная let позволяет ограничить область видимости блоком, что важно при манипуляциях с объектами Date. Рассмотрим практические сценарии использования.

let для изменяемой даты

Как объявить переменную даты, которую можно перезаписывать в пределах одного блока?

Основной подход – использование let для хранения текущей даты с последующим изменением её свойств.

let currentDate = new Date();
currentDate.setFullYear(2025);
console.log(currentDate.getFullYear()); // 2025

Let js (объявление let в javascript)

Область видимости currentDate ограничена блоком, в котором объявлена переменная. Это защищает код от случайного изменения даты в глобальной области.

Типичная ошибка:

Забывают про область видимости let при использовании в циклах. Переменная, объявленная внутри цикла, недоступна после его завершения.

Вариант 1: let внутри условного оператора

Как проверить, является ли дата выходным, используя временную переменную?

let day = new Date().getDay();
let isWeekend;
if (day === 0 || day === 6) {
  let weekendMessage = 'Сегодня выходной';
  isWeekend = true;
  console.log(weekendMessage);
}
// weekendMessage здесь недоступен

Javascript var text (переменная text в javascript)

Переменная weekendMessage существует только внутри блока if.

Возможная проблема:

Попытка обратиться к weekendMessage вне блока вызовет ReferenceError.

Вариант 2: let в цикле для перебора массива дат

Как корректно получить индекс каждой даты в асинхронной операции?

const dates = [new Date('2024-01-01'), new Date('2024-06-15')];
for (let i = 0; i < dates.length; i++) {
  setTimeout(() => {
    console.log(`Дата ${i}: ${dates[i].toISOString()}`);
  }, 1000);
}

Js defined (проверка определения переменной в javascript)

Объявление let i в заголовке цикла создаёт новую привязку для каждой итерации, поэтому в каждом колбэке сохраняется правильное значение i.

Ошибка при использовании var:

Если бы вместо let использовалась var, все колбэки вывели бы i = 2.

Вариант 3: let с деструктуризацией компонентов даты

Как извлечь отдельные компоненты даты в локальные переменные?

const now = new Date();
let { getFullYear: yearFn, getMonth: monthFn } = now;
console.log(yearFn.call(now)); // текущий год

Деструктуризация методов объекта Date в переменные let позволяет временно сохранить ссылки на функции. Область видимости ограничена блоком.

Сложность:

Методы теряют контекст (this), поэтому требуется явный вызов с .call(now).

Вариант 4: let для параметров функции по умолчанию

Как задать сегодняшнюю дату как значение по умолчанию для параметра?

function logDate(date = new Date()) {
  let localDate = date;
  console.log(localDate.toLocaleDateString());
}
logDate(); // выведет текущую дату

Переменная localDate позволяет модифицировать дату внутри функции, не затрагивая внешний код.

Предостережение:

Параметр по умолчанию вычисляется каждый раз при вызове, что для new Date() даёт актуальную дату, но может быть неожиданным при частых вызовах.

Расширенные примеры let в контексте дат

Замыкания с let в цикле для генерации цепочки дат

Пример показывает, как let сохраняет индекс каждой итерации для асинхронной обработки массива дат.

Пример
const dates = [
  new Date('2024-01-01'),
  new Date('2024-02-14'),
  new Date('2024-12-25')
];

for (let i = 0; i < dates.length; i++) {
  setTimeout(() => {
    console.log(`Индекс ${i}: ${dates[i].toDateString()}`);
  }, i * 1000);
}
Индекс 0: Mon Jan 01 2024
Индекс 1: Wed Feb 14 2024
Индекс 2: Wed Dec 25 2024

Без letvar) результат был бы Индекс 3 для всех итераций.

let и временные зоны: парсинг дат из строк

Объявление let для хранения промежуточных результатов преобразования.

Пример
function parseDate(input) {
  let parsed = Date.parse(input);
  if (isNaN(parsed)) {
    let errorMsg = 'Некорректная дата';
    throw new Error(errorMsg);
  }
  let dateObj = new Date(parsed);
  return dateObj;
}

try {
  let result = parseDate('2024-13-01');
  console.log(result);
} catch (e) {
  console.error(e.message);
}
Некорректная дата

Переменная errorMsg видна только внутри блока if, что изолирует сообщение об ошибке.

Использование let для переопределения в пределах одного блока

Демонстрация повторного объявления в разных блоках.

Пример
let current = new Date();
{
  let current = new Date(2020, 0, 1);
  console.log(current.getFullYear()); // 2020
}
console.log(current.getFullYear()); // текущий год
2020
2024 (или другой текущий)

Переменная current внутри блока теневая по отношению к внешней, что позволяет временно работать с другой датой.

let и цепочка Promise при работе с датами

Пример асинхронной обработки дат с сохранением состояния через let.

Пример
function fetchFutureDate(daysAhead) {
  return new Promise(resolve => {
    let futureDate = new Date();
    futureDate.setDate(futureDate.getDate() + daysAhead);
    setTimeout(() => resolve(futureDate), 1000);
  });
}

let startDate = new Date();
fetchFutureDate(10).then(date => {
  let diff = date - startDate;
  console.log(`Разница в миллисекундах: ${diff}`);
});
Разница в миллисекундах: 864000000

Переменные startDate и diff существуют в своих блоках, предотвращая загрязнение глобальной области.

Объявление let в JavaScript - comments

En
Let js (javascript)