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

date.GetMonth()不是函数

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

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

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

谢谢

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


当前回答

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

其他回答

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

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

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

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

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

无论如何,您可以通过执行此操作来检查对象是否具有getMonth属性。这并不一定意味着对象是Date,而是任何具有getMonth属性的对象。

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

为了检查该值是否是标准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)最后检查该值是否不是无效日期。

如果您不关心iframes/其他上下文,这是一种非常简单的方法。

// isNaN(Invalid Date) == true
if (date instanceof Date && !isNaN(date)) { // isNaN wont accept a date in typescript, use date.getTime() instead to produce a number
    console.log("is date!");
}

检查对象是否实际上是日期,而不是看起来像日期的对象。任何对象都可以有getMonth函数。确保日期不是无效日期不将值传递到新的Date()中,其中数字甚至字符串都可以转换为Date。

如果您需要支持iframes和不同的上下文,您可以使用接受的答案,但添加额外的检查以识别无效日期。

// isNaN(Invalid Date) == true
if (Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date)) {
    console.log("is date!");
}