【问题标题】:Comparing a Moment object to a Date object - how does it work?将 Moment 对象与 Date 对象进行比较 - 它是如何工作的?
【发布时间】:2020-07-22 21:29:48
【问题描述】:

我遇到了以下代码(nodejs v10.15):

...
return l.createdAt < pdate;

其中l.createdAtDate 的实例,pdate 是 Moment 对象。

我希望是这样的:

pdate.isAfter(l.createdAt)

moment(l.createdAt).isBefore(pdate)

但奇怪的是:我检查了几个示例,看起来这种比较效果很好,即使比较了两种不同类型的对象!

我的问题是:l.createdAt &lt; pdate 是如何工作的?

JS 是否足够“聪明”并且知道它应该将右侧强制转换为 Date 对象?

来自我的 IDE 的屏幕截图:

【问题讨论】:

    标签: javascript node.js date momentjs


    【解决方案1】:

    pdate.isAfter(l.createdAt) 工作不是因为 JS 足够聪明,而是因为 lib 处理这种情况。

    你所说的第一次有效,因为时刻对象被转换为表示时间戳的原始数字(以毫秒为单位)(参见MDM doc

    console.log(moment('2019-12-12') < new Date())// true
    console.log(moment('2021-12-12') < new Date())// false
    
    console.log(new Date() < moment('2019-12-12'))// false
    console.log(new Date() < moment('2021-12-12'))// true
    
    console.log(+moment('2019-12-12'))// 1576105200000
    console.log(+new Date())// 1595454345427
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"&gt;&lt;/script&gt;

    再看看这个

    const object1 = {
      foo:'bar',
      [Symbol.toPrimitive](hint) {
        if (hint === 'number') {
          return 42;
        }
        return null;
      }
    };
    console.log(object1 < 23);// false
    console.log(object1 < 55);// true
    console.log(+object1);// 42

    【讨论】:

    • 请仔细阅读问题...我知道pdate.isAfter(l.createdAt) 有效,为什么,这不是我问的问题
    • 你在说什么演员?
    • 是的,因为演员阵容,它可以在浏览器或节点中运行。 (看看我对 symbol.toPrimitive 的回应)。当您使用运算符+&lt; 调用对象时,它会将您的对象转换为原始对象。
    • 什么被转换成什么原始类型? 这正是我想要弄清楚的
    • 时刻对象和日期对象被转换为表示时间戳(以毫秒为单位)的原始数字,在我的示例中,您在 cmets 中有信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多