Как проверить, является ли объект датой?
У меня есть раздражающая ошибка на веб-странице:
date.GetMonth() не является функцией
Итак, я полагаю, что я делаю что-то не так. Переменная date
не является объектом типа Date
. Как я могу проверить тип данных в Javascript? Я пытался добавить if (date)
, но он не работает.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Итак, если я хочу написать защитный код и предотвратить форматирование даты (не одной), как мне это сделать?
Спасибо!
ОБНОВЛЕНИЕ: Я не хочу проверять формат даты, но хочу убедиться, что параметр, переданный методу getFormatedDate()
, имеет тип Date
.
Ответы
Ответ 1
В качестве альтернативы печатанию утки с помощью
typeof date.getMonth === 'function'
вы можете использовать оператор instanceof
, т.е. но он вернет true и для неверных дат, например. new Date('random_string')
также является экземпляром Date
date instanceof Date
Это произойдет, если объекты передаются через границы фрейма.
Обход для этого - проверка класса объекта с помощью
Object.prototype.toString.call(date) === '[object Date]'
Ответ 2
Вы можете использовать следующий код:
(myvar instanceof Date) // returns true or false
Ответ 3
Чтобы проверить, является ли значение допустимым типом стандартного объекта JS-date, вы можете использовать этот предикат:
function isValidDate(date) {
return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
date
проверяет, не является ли параметр ложным значением (undefined
, null
, 0
, ""
и т.д.)
Object.prototype.toString.call(date)
возвращает собственное строковое представление данного типа объекта - в нашем случае "[object Date]"
. Поскольку date.toString()
переопределяет его родительский метод, нам нужно .call
или .apply
метод из Object.prototype
напрямую, который..
!isNaN(date)
окончательно проверяет, не было ли значение Invalid Date
.
Ответ 4
Функция getMonth()
, а не getMonth()
.
В любом случае, вы можете проверить, обладает ли объект свойством getMonth, выполнив это. Это не обязательно означает, что объект является Датой, просто любым объектом, обладающим свойством getMonth.
if (date.getMonth) {
var month = date.getMonth();
}
Ответ 5
Как указано выше, вероятно, проще всего проверить, существует ли функция перед ее использованием. Если вам действительно интересно, что это Date
, а не только объект с функцией getMonth()
, попробуйте следующее:
function isValidDate(value) {
var dateWrapper = new Date(value);
return !isNaN(dateWrapper.getDate());
}
Это создаст либо клон значения, если он Date
, либо создаст недопустимую дату. Затем вы можете проверить, недействительно ли новое значение даты или нет.
Ответ 6
Для всех типов я создал функцию прототипа объекта. Он может быть вам полезен
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')) { /* do things */ }
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] );
}
// usage
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
// note: you can't use this for NaN (NaN === Number)
(+'ab2').is(Number); //=> true
Ответ 7
UnderscoreJS и Lodash имеют функцию под названием .isDate()
, которая, кажется, именно то, что вам нужно. Стоит посмотреть на их соответствующие реализации: Lodash isDate, UnderscoreJs
Ответ 8
Лучший способ найти:
!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001")) // true
!isNaN(Date.parse("blabla")) // false
Ответ 9
Вы можете проверить, существует ли функция, специфичная для объекта Date:
function getFormatedDate(date) {
if (date.getMonth) {
var month = date.getMonth();
}
}
Ответ 10
Также вы можете использовать короткую форму
function getClass(obj) {
return {}.toString.call(obj).slice(8, -1);
}
alert( getClass(new Date) ); //Date
или что-то вроде этого:
(toString.call(date)) == 'Date'
Ответ 11
Я использую гораздо более простой способ, но не уверен, что это доступно только в ES6 или нет.
let a = {name: "a", age: 1, date: new Date("1/2/2017"), arr: [], obj: {} };
console.log(a.name.constructor.name); // "String"
console.log(a.age.constructor.name); // "Number"
console.log(a.date.constructor.name); // "Date"
console.log(a.arr.constructor.name); // "Array"
console.log(a.obj.constructor.name); // "Object"
Однако это не будет работать с null или undefined, поскольку у них нет конструктора.
Ответ 12
Эта функция вернет true
, если это Date или false
иначе:
function isDate(myDate) {
return myDate.constructor.toString().indexOf("Date") > -1;
}
Ответ 13
Вместо всех обходных путей вы можете использовать следующее:
dateVariable = new Date(date);
if (dateVariable == 'Invalid Date') console.log('Invalid Date!');
Я нашел этот взлом лучше!
Ответ 14
Фактически дата будет иметь тип Object
. Но вы можете проверить, имеет ли объект метод getMonth
, и если он доступен для вызова.
function getFormatedDate(date) {
if (date && date.getMonth && date.getMonth.call) {
var month = date.getMonth();
}
}
Ответ 15
Еще один вариант:
Date.prototype.isPrototypeOf(myDateObject)
Ответ 16
Подход с использованием try/catch
function getFormatedDate(date = new Date()) {
try {
date.toISOString();
} catch (e) {
date = new Date();
}
return date;
}
console.log(getFormatedDate());
console.log(getFormatedDate('AAAA'));
console.log(getFormatedDate(new Date('AAAA')));
console.log(getFormatedDate(new Date(2018, 2, 10)));
Ответ 17
Не могли бы вы просто использовать
function getFormatedDate(date) {
if (date.isValid()) {
var month = date.GetMonth();
}
}