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

date.GetMonth()不是函数

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

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

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

谢谢

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


当前回答

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

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

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

其他回答

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

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

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

如果该函数为Date,则返回true,否则返回false:

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

使用以下方法,您甚至可以将日期no检查为“无效日期”

if(!!date.getDate()){
    console.log('date is valid')
}

我找到的最佳方法是:

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

我在React钩子上遇到了一些问题,其中Date将在稍后出现/延迟加载,然后初始状态不能为null,它不会通过ts检查,但显然空Object会成功!:)

const [birthDate, setBirthDate] = React.useState({})

<input
  value={birthDate instanceof Date ? birthDate.toISOString() : ''}
  name="birthDay"
/>