我在当前项目中使用了moment.js,我发现比较运算符<,>,> =,< =正常工作。但是==没有。
令我惊讶的是,这些工作以及您不需要使用.isBefore()和.isAfter()函数。
有人能简单介绍一下这些工作的原因吗?是否有可能使==也能工作?
感谢。
答案 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编号。