Как проверить, является ли объект датой?
У меня есть раздражающая ошибка на веб-странице:
date.GetMonth() не является функцией
Я предполагаю, что я что-то делаю не так. Переменная date
не является объектом типа Date
. Как я могу проверить тип данных в Javascript? Я пробовал добавить if (date)
, но это не сработало.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Итак, если я хочу написать защитный код и предотвратить форматирование, когда переданная дата не является таковой, как мне это сделать?
Спасибо!
ОБНОВЛЕНИЕ: Я не хочу проверять формат даты, я хочу увериться, что параметр, передаваемый в метод getFormatedDate()
, является типом Date
.
5 ответ(ов)
Функция называется getMonth()
, а не GetMonth()
.
Тем не менее, вы можете проверить, имеет ли объект свойство getMonth
, сделав следующее. Это не обязательно указывает на то, что объект является экземпляром Date, просто что у него есть свойство getMonth
.
if (date.getMonth) {
var month = date.getMonth();
}
Это довольно простой подход, если вас не беспокоят iframe и другие контексты.
// isNaN(Invalid Date) == true
if (date instanceof Date && !isNaN(date)) { // isNaN не принимает дату в TypeScript, используйте date.getTime(), чтобы получить число
console.log("это дата!");
}
- Проверяет, что объект действительно является
Date
, а не чем-то, что похоже на него. Любой объект может иметь функциюgetMonth
. - Убедитесь, что дата не является
Invalid Date
. - Не передает значение в
new Date()
, где число или даже строка могут быть преобразованы в дату.
Если вам нужно поддерживать iframe и разные контексты, вы можете использовать ответ, который принято считать правильным, но добавьте дополнительную проверку для идентификации недопустимых дат.
// isNaN(Invalid Date) == true
if (Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date)) {
console.log("это дата!");
}
Таким образом, вы получите более надежную проверку, которая будет работать в различных контекстах.
Ваш вопрос касается создания функции для проверки типов объектов в JavaScript. Я разработал метод для объекта Object
, который может оказаться полезным:
Object.prototype.typof = function(chkType) {
var inp = String(this.constructor),
customObj = inp.split(/\({1}/)[0].replace(/^\n/, '').substr(9),
regularObj = Object.prototype.toString.apply(this),
thisType = regularObj.toLowerCase()
.match(new RegExp(customObj.toLowerCase()))
? regularObj : '[object ' + customObj + ']';
return chkType
? thisType.toLowerCase().match(chkType.toLowerCase())
? true : false
: thisType;
}
Теперь вы можете проверять любой тип следующим образом:
var myDate = new Date().toString(),
myRealDate = new Date();
if (myRealDate.typof('Date')) { /* выполняем действия */ }
alert(myDate.typof()); // => String
[Редактирование март 2013] На основе новых знаний я предлагаю улучшенный метод:
Object.prototype.is = function() {
var test = arguments.length ? [].slice.call(arguments) : null,
self = this.constructor;
return test ? !!(test.filter(function(a) { return a === self }).length)
: (this.constructor.name ||
(String(self).match(/^function\s*([^\s(]+)/im) || [0, 'ANONYMOUS_CONSTRUCTOR'])[1]);
}
// использование
var Some = function() { /* ... */ },
Other = function() { /* ... */ },
some = new Some();
2..is(String, Function, RegExp); // => false
2..is(String, Function, Number, RegExp); // => true
'hello'.is(String); // => true
'hello'.is(); // => String
/[a-z]/i.is(); // => RegExp
some.is(); // => 'ANONYMOUS_CONSTRUCTOR'
some.is(Other); // => false
some.is(Some); // => true
// заметка: вы не можете использовать это для NaN (NaN === Number)
(+'ab2').is(Number); // => true
Этот новый метод is
позволяет удобно проверять, на какой класс принадлежит объект, и возвращает имя конструктора или 'ANONYMOUS_CONSTRUCTOR' для анонимных функций. Надеюсь, это будет вам полезно!
Наилучший способ, который я нашел, выглядит следующим образом:
!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001")) // true
!isNaN(Date.parse("blabla")) // false
Этот код использует метод Date.parse()
для проверки, является ли строка допустимой датой. Если строка может быть преобразована в дату, Date.parse()
вернет время в миллисекундах (число), и isNaN()
вернет false
. В противном случае будет возвращено значение NaN, и isNaN()
вернет true
. Таким образом, вы сможете определить, является ли ваша строка действительной датой или нет.
Вместо всех обходных путей, вы можете использовать следующий код:
dateVariable = new Date(date);
if (dateVariable.toString() === 'Invalid Date') console.log('Некорректная дата!');
Я нашел этот хак лучше!
Как отформатировать дату в JavaScript?
Где найти документацию по форматированию даты в JavaScript?
Форматирование даты в JavaScript в виде yyyy-mm-dd
Как вычесть дни из обычной даты?
Как преобразовать дату в UTC?