我在网页上有一个烦人的bug:

date.GetMonth()不是函数

所以,我想我做错了什么。变量date不是date类型的对象。如何在Javascript中检查数据类型?我试图添加一个if(日期),但不起作用。

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

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

谢谢

UPDATE:我不想检查日期的格式,但我想确保传递给getFormatedDate()方法的参数是date类型。


当前回答

作为通过

typeof date.getMonth === 'function'

您可以使用instanceof运算符,即,对于无效日期,它也将返回true,例如,new Date('random_string')也是Date的实例

date instanceof Date

如果对象跨越帧边界传递,则此操作将失败。

解决方法是通过

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

其他回答

实际日期的类型为Object。但是您可以检查对象是否具有getMonth方法,以及它是否可调用。

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

作为通过

typeof date.getMonth === 'function'

您可以使用instanceof运算符,即,对于无效日期,它也将返回true,例如,new Date('random_string')也是Date的实例

date instanceof Date

如果对象跨越帧边界传递,则此操作将失败。

解决方法是通过

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

还有一种变体:

Date.prototype.isPrototypeOf(myDateObject)

为了检查该值是否是标准JS日期对象的有效类型,可以使用此谓词:

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()重写了它的父方法,所以我们需要直接调用或应用Object.prototype中的方法。。绕过具有相同构造函数名称的用户定义对象类型(例如:“Date”)与instanceof或Date.prototype.isPrototypeOf不同,可以跨不同的JS上下文(例如iframes)工作。!isNaN(date)最后检查该值是否不是无效日期。

UndercoreJS和Lodash有一个名为.isDate()的函数,这似乎正是您所需要的。值得一看它们各自的实现:Lodash isDate、UndercoreJs