Проверка типа объекта "Date" в JavaScript: эффективный способ
Быстрый ответ
Для определения, является ли объект экземпляром класса Date
, используйте метод Object.prototype.toString.call
. Если функция возвращает "[object Date]"
, перед вами действительно экземпляр класса Date. Этот подход представлен на примере простой и эффективной функции:
const isDate = obj => Object.prototype.toString.call(obj) === '[object Date]';
Пример использования:
console.log(isDate(new Date())); // true – это дата
console.log(isDate({})); // false – это просто пустой объект
Вопрос: где применим оператор instanceof?
Оператор instanceof Date
может показаться удобным способом определить, является ли объект экземпляром класса Date, однако его использование имеет определенные недостатки. Например, оператор вернет результат true, даже если объект невалидный:
console.log(new Date('неправильно') instanceof Date); // true – но это ошибка!
Для избежания подобных несостыковок придерживайтесь принципов оборонительного программирования, избегая создания экземпляров класса Date с некорректными аргументами.
Объекты класса Date и проблема взаимодействия между фреймами JavaScript
Обеспечение корректного взаимодействия между различными фреймами JavaScript является сложной задачей, однако Object.prototype.toString.call()
заметно упрощает её решение. Порой важны даже мелочи, например, регистр в названии методов, вроде date.getMonth
— вам придётся быть особенно внимательными.
Определение границ при работе с невалидными датами
Для определения, является ли объект настоящим экземпляром класса Date, применяйте проверку !isNaN(date)
, а также убедитесь, что объект обладает методом getMonth
:
const isValidDate = date => {
return isDate(date) && !isNaN(date) && typeof date.getMonth === 'function';
};
console.log(isValidDate(new Date())); // true – отлично, это настоящий объект типа дата!
console.log(isValidDate(new Date('foo'))); // false – нет, это не дата.
Такой подход защищает от возникновения ошибок, связанных со "Invalid Date".
Визуализация
Вот так можно отличить настоящий объект класса Date от подделок:
Представим стену, на которой размещены формы для вставки:
🕒🔲 **Квадрат**: отсеивает непригодное (например, объекты, не имеющие отношения к датам)
🕒🔵 **Круг**: игнорирует некорректные (например, запутанные форматы дат)
🕒🔳 **Форма Date**: с ней всё хорошо!
Задача: объект должен без препятствий проходить через "форму Date":
if (Object.prototype.toString.call(suspectedDate) === '[object Date]') {
// Похоже, мы имеем дело с настоящей датой! 🎉
} else {
// Увы, нет. Это неподходящий объект. 🔴
}
Мы играем в потешную игру с подбором комбинаций форм в царстве объектов JavaScript!
Правила работы с настоящими объектами класса Date
При работе с объектами класса Date важно придерживаться принципов оборонительного программирования. Оградите приложение от попыток выполнения форматирования объектов, не являющихся датами, контролируйте достоверность вводимых данных:
function formatDate(date) {
if (!isValidDate(date)) {
// Осторожное предупреждение о попытке смешивать несовместимые вещи!
throw new TypeError('Прежде чем форматировать, убедитесь, что обрабатываем объект действительно имеет тип дата!');
}
// Теперь дату можно форматировать
}
Такие меры помогают минимизировать риск возникновения ошибок при работе с датами.
Duck typing в контексте дат
"Duck typing" – это принцип, согласно которому, если объект "крякает" как утка, он и есть утка, или в нашем случае — дата. Для проверки применяемости этого подхода проверьте наличие метода getMonth
:
const isDateDuckTyped = obj => typeof obj.getMonth === 'function';
Не всегда объект должен быть "идеальной уткой", достаточно, чтобы он был похож на Date.
Передовые методики: примеры из практики
Будьте внимательны при работе с особыми случаями и старайтесь улучшать проверку невалидных дат, особенно в сложных ситуациях. Соблюдение синтаксиса методов и избегание передачи неправильных типов в new Date()
может показаться очевидным, но это исключает многие потенциальные грабли при работе с датами.
Полезные материалы
- Date – JavaScript | MDN — полное руководство и справочник по объекту Date в JavaScript.
- Как обнаружить невалидную дату в экземпляре Date в JavaScript – Stack Overflow — обсуждения и примеры валидации даты от сообщества.
- Спецификация ECMAScript® 2024 — информация о свойствах и методах объектов Date в стандартах языка JavaScript.
- Дата и время – JavaScript.info — простой и ясный учебник по работе с датами и временем в JavaScript.
- Справочник JavaScript по Date – W3Schools — удобное руководство по методам и свойствам Date в JavaScript.
- JavaScript: самый недооцененный язык программирования — важные мысли Дугласа Крокфорда о лучших практиках в JavaScript.
- date-fns: современная библиотека утилит для работы с датами в JavaScript — современный набор инструментов для работы с датами, включая функции проверки.