Объявление let и манипуляции с датами
Объявление let при работе с датами в JavaScript
Переменная let позволяет ограничить область видимости блоком, что важно при манипуляциях с объектами Date. Рассмотрим практические сценарии использования.
let для изменяемой даты
Как объявить переменную даты, которую можно перезаписывать в пределах одного блока?
Основной подход – использование let для хранения текущей даты с последующим изменением её свойств.
let currentDate = new Date();
currentDate.setFullYear(2025);
console.log(currentDate.getFullYear()); // 2025Let 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
Без let (с var) результат был бы Индекс 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 существуют в своих блоках, предотвращая загрязнение глобальной области.