如何检查一个对象是否是一个date?

我有一个恼人的错误在网页上:“date.GetMonth()不是一个函数”。 所以我想,我做了一些错误,因为某个地方,对象date不是一个Datetypes的对象。 我如何检查在JavaScript中的数据types? 我试图添加一个if(date),但它不起作用。

function getFormatedDate(date) { if (date) { var month = date.GetMonth(); } } 

所以,如果我想写防御性的代码,并防止date(这是不是一个)被格式化,我该怎么做?

谢谢!

更新:我不想检查date的格式,但我想确保传递给方法getFormatedDate的参数是Datetypes。

作为通过鸭子打字的替代方法

 typeof date.getMonth === 'function' 

你可以使用instanceof运算符,也就是说,它也会在无效date返回true,例如new Date('random_string')也是Date的实例

 date instanceof Date 

如果对象通过帧边界传递,这将失败。

解决这个问题的方法是通过检查对象的类

 Object.prototype.toString.call(date) === '[object Date]' 

您可以使用下面的代码:

 (myvar instanceof Date) // returns true or false 

函数是getMonth() ,而不是GetMonth()

无论如何,你可以通过这个来检查对象是否有getMonth属性。 它不一定意味着该对象是一个date,只是具有getMonth属性的任何对象。

 if (date.getMonth) { var month = date.getMonth(); } 

如上所述,在使用之前检查函数是否存在可能是最简单的。 如果你真的关心它是一个Date ,而不只是一个具有getMonth()函数的对象,试试这个:

 function isValidDate(value) { var dateWrapper = new Date(value); return !isNaN(dateWrapper.getDate()); } 

如果它是一个Date ,这将创build值的克隆,或者创build一个无效的date。 然后您可以检查新date的值是否无效。

对于所有types,我制作了一个对象原型函数。 这可能对你有用

 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; } 

现在你可以检查这样的任何types:

 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 /[az]/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 

您可以检查是否存在特定于Date对象的函数:

 function getFormatedDate(date) { if (date.getMonth) { var month = date.getMonth(); } } 

下划线,Lodash和类似的库有.isDate()助手。 很有用。

为了检查这个值是否是标准的JS-Date对象的有效types,你可以使用这个谓词:

 function isValidDate (date) { return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date); } 
  1. date检查参数是否undefinednull0NaN"" ,或者简单地为false
  2. Object.prototype.toString.call(date)返回给定对象types的本地string表示forms – 在我们的例子中是"[object Date]" 。 因为date.toString覆盖了它的父方法,所以我们需要从Object.prototype直接Object.prototype或者.apply这个方法。
    • 使用相同的构造函数名称(例如:“Date”)旁路用户定义的对象types
    • 适用于不同的JS上下文(例如iframe),与instanceof相反。
  3. !isNaN(date)最后检查值是不是一个Invalid Date

当使用jQuery时, Object.prototype.toString.call(date) === "[object Date]"可以replace为jQuery.type(date) === "date"

如果是Date,该函数将返回true ,否则返回false

 function isDate(myDate) { return myDate.constructor.toString().indexOf("Date") > -1; } 

实际上date将是Objecttypes。 但是你可以检查对象是否有getMonth方法,以及是否可以调用。

 function getFormatedDate(date) { if (date && date.getMonth && date.getMonth.call) { var month = date.getMonth(); } } 

我发现的最好的方法是:

 !isNaN(Date.parse("some date test")) // !isNaN(Date.parse("22/05/2001")) // true !isNaN(Date.parse("blabla")) // false 

也可以使用简写forms

 function getClass(obj) { return {}.toString.call(obj).slice(8, -1); } alert( getClass(new Date) ); //Date 

或者像这样的东西:

 (toString.call(date)) == 'Date' 

我一直在使用一个更简单的方法,但不知道这是否仅在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上工作。

你不能用吗?

 function getFormatedDate(date) { if (date.isValid()) { var month = date.GetMonth(); } }