Проверка типа объекта "Date" в JavaScript: эффективный способ

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения, является ли объект экземпляром класса Date, используйте метод Object.prototype.toString.call. Если функция возвращает "[object Date]", перед вами действительно экземпляр класса Date. Этот подход представлен на примере простой и эффективной функции:

JS
Скопировать код
const isDate = obj => Object.prototype.toString.call(obj) === '[object Date]';

Пример использования:

JS
Скопировать код
console.log(isDate(new Date()));  // true – это дата
console.log(isDate({}));          // false – это просто пустой объект
Кинга Идем в IT: пошаговый план для смены профессии

Вопрос: где применим оператор instanceof?

Оператор instanceof Date может показаться удобным способом определить, является ли объект экземпляром класса Date, однако его использование имеет определенные недостатки. Например, оператор вернет результат true, даже если объект невалидный:

JS
Скопировать код
console.log(new Date('неправильно') instanceof Date); // true – но это ошибка!

Для избежания подобных несостыковок придерживайтесь принципов оборонительного программирования, избегая создания экземпляров класса Date с некорректными аргументами.

Объекты класса Date и проблема взаимодействия между фреймами JavaScript

Обеспечение корректного взаимодействия между различными фреймами JavaScript является сложной задачей, однако Object.prototype.toString.call() заметно упрощает её решение. Порой важны даже мелочи, например, регистр в названии методов, вроде date.getMonth — вам придётся быть особенно внимательными.

Определение границ при работе с невалидными датами

Для определения, является ли объект настоящим экземпляром класса Date, применяйте проверку !isNaN(date), а также убедитесь, что объект обладает методом getMonth:

JS
Скопировать код
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 от подделок:

Markdown
Скопировать код
Представим стену, на которой размещены формы для вставки:

🕒🔲 **Квадрат**: отсеивает непригодное (например, объекты, не имеющие отношения к датам)
🕒🔵 **Круг**: игнорирует некорректные (например, запутанные форматы дат)
🕒🔳 **Форма Date**: с ней всё хорошо!

Задача: объект должен без препятствий проходить через "форму Date":

JS
Скопировать код
if (Object.prototype.toString.call(suspectedDate) === '[object Date]') {
  // Похоже, мы имеем дело с настоящей датой! 🎉
} else {
  // Увы, нет. Это неподходящий объект. 🔴
}

Мы играем в потешную игру с подбором комбинаций форм в царстве объектов JavaScript!

Правила работы с настоящими объектами класса Date

При работе с объектами класса Date важно придерживаться принципов оборонительного программирования. Оградите приложение от попыток выполнения форматирования объектов, не являющихся датами, контролируйте достоверность вводимых данных:

JS
Скопировать код
function formatDate(date) {
  if (!isValidDate(date)) {
    // Осторожное предупреждение о попытке смешивать несовместимые вещи!
    throw new TypeError('Прежде чем форматировать, убедитесь, что обрабатываем объект действительно имеет тип дата!');
  }
  // Теперь дату можно форматировать
}

Такие меры помогают минимизировать риск возникновения ошибок при работе с датами.

Duck typing в контексте дат

"Duck typing" – это принцип, согласно которому, если объект "крякает" как утка, он и есть утка, или в нашем случае — дата. Для проверки применяемости этого подхода проверьте наличие метода getMonth:

JS
Скопировать код
const isDateDuckTyped = obj => typeof obj.getMonth === 'function';

Не всегда объект должен быть "идеальной уткой", достаточно, чтобы он был похож на Date.

Передовые методики: примеры из практики

Будьте внимательны при работе с особыми случаями и старайтесь улучшать проверку невалидных дат, особенно в сложных ситуациях. Соблюдение синтаксиса методов и избегание передачи неправильных типов в new Date() может показаться очевидным, но это исключает многие потенциальные грабли при работе с датами.

Полезные материалы

  1. Date – JavaScript | MDN — полное руководство и справочник по объекту Date в JavaScript.
  2. Как обнаружить невалидную дату в экземпляре Date в JavaScript – Stack Overflow — обсуждения и примеры валидации даты от сообщества.
  3. Спецификация ECMAScript® 2024 — информация о свойствах и методах объектов Date в стандартах языка JavaScript.
  4. Дата и время – JavaScript.info — простой и ясный учебник по работе с датами и временем в JavaScript.
  5. Справочник JavaScript по Date – W3Schools — удобное руководство по методам и свойствам Date в JavaScript.
  6. JavaScript: самый недооцененный язык программирования — важные мысли Дугласа Крокфорда о лучших практиках в JavaScript.
  7. date-fns: современная библиотека утилит для работы с датами в JavaScript — современный набор инструментов для работы с датами, включая функции проверки.