我在网页上有一个恼人的错误:
date.GetMonth()不是函数
所以,我想我做错了什么 . 变量 date
不是 Date
类型的对象 . How can I check for a datatype in Javascript? 我试图添加 if (date)
,但它不起作用 .
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
所以,如果我想编写防御性代码并防止格式化日期(不是一个),我该怎么做?
谢谢!
UPDATE: 我不想检查日期的格式,但我想确保传递给方法 getFormatedDate()
的参数是 Date
类型 .
15 回答
如上所述,'s probably easiest to just check if the function exists before using it. If you really care that it'是Date,而不仅仅是具有
getMonth()
函数的对象,请尝试以下方法:如果它是
Date
,这将创建值的克隆,或创建无效日期 . 然后,您可以检查新日期的值是否无效 .您可以检查特定于Date对象的函数是否存在:
作为鸭子打字的替代品
你可以使用
instanceof
运算符,即它也会因无效日期而返回true,例如new Date('random_string')
也是Date的实例如果对象跨帧边界传递,则会失败 .
解决方法是通过检查对象的类
为了检查值是否是标准JS-date对象的有效类型,您可以使用此谓词:
date
检查参数是否为falsy value(undefined
,null
,0
,""
等..)Object.prototype.toString.call(date)
返回给定对象类型的native string representation - 在我们的例子中是"[object Date]"
. 因为date.toString() overrides its parent method,我们需要.call或.apply直接从Object.prototype
方法...使用相同的构造函数名称绕过用户定义的对象类型(例如:"Date")
适用于contrast to instanceof或Date.prototype.isPrototypeOf中的不同JS上下文(例如iframe) .
!isNaN(date)
最后检查该值是否为Invalid Date
.我一直在使用更简单的方法但不确定这是否仅在ES6中可用 .
但是,这不会对null或undefined有效,因为它们没有构造函数 .
如果是Date,则此函数将返回
true
,否则返回false
:我找到的最好方法是:
您也可以使用简短形式
或类似的东西:
你能不能用
您可以使用以下代码:
对于所有类型,我都编写了一个Object原型函数 . 它可能对你有用
现在你可以检查这样的任何类型:
[ Edit march 2013 ]基于进步的洞察力,这是一个更好的方法:
UnderscoreJS和Lodash有一个名为.isDate()的功能,它看起来正是你所需要的 . 值得一看的是它们各自的实现:Lodash isDate,UnderscoreJs
该函数是
getMonth()
,而不是GetMonth()
.无论如何,您可以通过执行此操作来检查对象是否具有getMonth属性 . 它并不一定意味着对象是Date,只是具有getMonth属性的任何对象 .
另一个变种:
实际上日期的类型为
Object
. 但是你可以检查对象是否有getMonth
方法以及它是否可调用 .