我的应用程序有一个 HTML 表单,其中一些输入是从后端填充的,其他输入是由用户输入的(在
time
输入中)。当用户更改值时,onChange
函数会遍历每个输入。
从后端填充的输入被转换为
moment
对象,用户输入的日期只是字符串。这意味着 onChange
函数遇到了一些 moment
对象和一些字符串。我需要知道哪些输入是 moment
对象,哪些不是。
测试变量是否为
moment
对象的推荐方法是什么?
我注意到
moment
对象具有 _isAMomentObject
属性,但我想知道是否有另一种方法来测试变量是否是 moment
对象。
我尝试过的另一个选项是无论如何对变量调用
moment
。这会将 string
变量转换为 moment
对象,并且似乎不会影响现有 moment
对象。
您可以检查这是否是
instanceof
时刻:
moment() instanceof moment; // true
moment() 时刻实例;
永远是真的,因为如果你有
你总是在创建一个时刻对象。 所以唯一的办法就是这样检查
虽然从技术上讲,所有投票的回复都是真实的,并且是可行的方法,但在我的特殊情况下,@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 对象并且希望以不同的方式对待它们,那么您应该考虑提供的替代方案。
与@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');
}
}