MomentJS如何将值与>进行比较?和< (和> =,< =)?

时间:2014-04-11 18:08:09

标签: javascript momentjs

我在当前项目中使用了moment.js,我发现比较运算符<,>,> =,< =正常工作。但是==没有。

令我惊讶的是,这些工作以及您不需要使用.isBefore()和.isAfter()函数。

有人能简单介绍一下这些工作的原因吗?是否有可能使==也能工作?

感谢。

2 个答案:

答案 0 :(得分:9)

这是由于JavaScript中comparison and equality operators的工作原理(强调我的):

  

对于关系抽象比较(例如,< =),操作数首先是   在比较之前转换为基元,然后转换为相同的类型。

     

[...]

     

如果操作数不是,则等于运算符会转换操作数   相同的类型,然后应用严格的比较。如果任一操作数是a   如果是数字或布尔值,操作数将转换为数字   可能;否则,如果任一操作数是字符串,则字符串操作数为   如果可能,转换为数字。 如果两个操作数都是对象,那么   JavaScript比较内部引用,它们在操作数时是相等的   在内存中引用相同的对象。

因此,当两个时刻对象与不等式进行比较时,它们首先被转换为数字。对于Moment.js对象,这是自1970年1月1日午夜UTC的unix时期以来的毫秒数。

在您喜欢的浏览器的控制台窗口/节点REPL中:

> +moment()
<- 1412332710977

对于==等式检查,运行时会在两个对象之间进行参考比较,这两个对象会为两个不同的时刻实例返回false,即使它们都是相同的日期/时间。 / p>

JavaScript中缺少默认.equals()operator==()重载会使此行为变得非常直观,尤其是当您来自其他语言时。

另请注意,Moment的isBefore / isAfter函数真的慢,因为在进行比较之前,他们克隆内部的两个时刻对象(这是因为isBefore / isAfter有一个可选参数来指定要比较的时间组件(例如'hour'),无论该参数是否存在,它都会克隆。 / p>

Moment在这里受到可变对象的影响,这就是为什么它首先做一个防御clone(),然后再没有优化实际上不必要的公共路径。

答案 1 :(得分:4)

神奇的是ValueOf()。 JavaScript调用valueOf()方法在比较时将对象转换为原始值。 Moment对象overrides valueOf()方法基本上返回底层本机Date对象的valueOf()值,返回epoch编号。