如何测试变量是否是 Moment.js 对象?

问题描述 投票:0回答:5

我的应用程序有一个 HTML 表单,其中一些输入是从后端填充的,其他输入是由用户输入的(在

time
输入中)。当用户更改值时,
onChange
函数会遍历每个输入。

从后端填充的输入被转换为

moment
对象,用户输入的日期只是字符串。这意味着
onChange
函数遇到了一些
moment
对象和一些字符串。我需要知道哪些输入是
moment
对象,哪些不是。

测试变量是否为

moment
对象的推荐方法是什么?

我注意到

moment
对象具有
_isAMomentObject
属性,但我想知道是否有另一种方法来测试变量是否是
moment
对象。

我尝试过的另一个选项是无论如何对变量调用

moment
。这会将
string
变量转换为
moment
对象,并且似乎不会影响现有
moment
对象。

javascript momentjs
5个回答
114
投票

Moment 有一个

isMoment
方法 就是为了实现这样的目的。除非您知道要查找什么,否则在文档中找到它并不是特别容易。

它首先检查

instanceof
,然后如果失败(例如在某些子类化或跨领域情况下),它将测试
_isAMomentObject
属性。


40
投票

您可以检查这是否是

instanceof
时刻:

moment() instanceof moment; // true

3
投票

moment() 时刻实例;

永远是真的,因为如果你有

  • 时刻(未定义)实例时刻
  • 时刻(“你好”)时刻实例

你总是在创建一个时刻对象。 所以唯一的办法就是这样检查

  • 时刻(属性).isValid()

0
投票

虽然从技术上讲,所有投票的回复都是真实的,并且是可行的方法,但在我的特殊情况下,@Anang Sartia 的答案有效。

我有一个共享包库和两个导入包库的下游应用程序。一个下游应用程序从 MomentJS 迁移到 Date-FNS(适用于普通 JS Date 对象),而另一个应用程序仍然保留 Moment。从 Moment 迁移的原因主要是由于捆绑包大小较大,而且 MomentJS 不支持 tree-shaking(以及 MomentJS 团队在此提供的其他缺点 https://momentjs.com/#:~:text=考虑) %20使用%20Moment,在%20%20文档中

共享包有一个转换普通对象的方法。日期不符合该标准。因此,由于日期和时刻也是对象,因此必须忽略它们。使用

moment.isMoment(obj)
意味着共享包也需要安装 Moment.JS 只是为了检查这种特殊情况。而且由于
Moment.JS
不可进行树摇动,因此仅针对单个矩方法导入矩并不是一个好主意。 就我而言,我创建了一个检查
_isAMomentObject
的辅助方法。 @Anang Satria 评论的
isValid
可以出现在任何常规物体中。另一方面,任何有效的 Moment 对象都具有这个独特的属性
_isAMomentObject
。这样做,就我而言,它按预期工作了。

export function isMomentObject(obj: any) {
  return !!obj._isAMomentObject;
}

总结一下:

如果您已经将 MomentJS 定义为依赖项,那么

moment.isMoment(obj)
就是正确的选择。 如果您不想导入 Moment,但不知何故获得了 Moment 对象并且希望以不同的方式对待它们,那么您应该考虑提供的替代方案。


-1
投票

与@Fabien 的答案非常相似,我正在检查对象是否有

isValid
功能可用。

const checkMoment = (date) => {
    if(!date.isValid){ // check if it's not a moment object
        // do something if it's not moment object
        console.log('this is not a moment object');
    }
    else {
        // do something if it's a moment object
        console.log('this is a moment object');
    }
   
}
© www.soinside.com 2019 - 2024. All rights reserved.