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

date.GetMonth()不是函数

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

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

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

谢谢

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


当前回答

受这个答案的启发,这个解决方案在我的情况下有效(我需要检查从API收到的值是否为日期):

!isNaN(Date.parse(new Date(YourVariable)))

通过这种方式,如果它是来自客户端或任何其他对象的随机字符串,您可以发现它是否是类似日期的对象。

其他回答

你就不能用

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

我一直在使用一种更简单的方法,但不确定这是否仅在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无效,因为它们没有构造函数。

使用try/catch的方法

函数getFormattedDate(date=new date()){尝试{date.toISOString();}捕获(e){date=新日期();}返回日期;}console.log(getFormattedDate());console.log(getFormattedDate('AAAA'));console.log(getFormattedDate(新日期('AAAA')));console.log(getFormattedDate(新日期(2018,2,10));

您可以使用以下代码:

(myvar instanceof Date) // returns true or false

如上所述,在使用函数之前只检查函数是否存在可能是最简单的。如果您真的关心它是Date,而不仅仅是带有getMonth()函数的对象,请尝试以下操作:

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

这将创建值的克隆(如果它是日期),或创建无效日期。然后可以检查新日期的值是否无效。