这是由于 comparison and equality operators 在 JavaScript 中的工作方式(强调我的):
对于关系抽象比较(例如,在前的
在比较之前转换为基元,然后转换为相同的类型。
[...]
如果操作数不属于
相同类型,然后应用严格比较。如果任一操作数是
数字或布尔值,操作数将转换为数字,如果
可能的;否则,如果任一操作数是字符串,则字符串操作数是
如果可能,转换为数字。 如果两个操作数都是对象,那么
JavaScript 比较操作数时相等的内部引用
引用内存中的同一个对象。
所以当两个矩对象与不等式进行比较时,它们首先被转换为数字。对于 Moment.js 对象,这是自 1970 年 1 月 1 日午夜 UTC 的 unix 纪元以来的毫秒数。
在您喜欢的浏览器的控制台窗口/节点 REPL 中:
> +moment()
<- 1412332710977
对于== 相等性检查,运行时会在两个对象之间进行引用比较,这会为两个不同的时刻实例返回false,即使它们都针对相同的日期/时间。
JavaScript 中缺少默认的 .equals() 或 operator==() 重载使得这种行为相当违反直觉,尤其是当您来自其他语言时。
还要注意 Moment 的 isBefore/isAfter 函数真的很慢,因为它们在进行比较之前在内部克隆两个时刻对象(这是因为有isBefore/isAfter 的一个可选参数,用于指定要比较的时间组件(例如 'hour'),无论此参数是否存在,它都会进行克隆。
Moment 在这里受到可变对象的困扰,这就是为什么它首先要做防御性clone(),然后进一步没有优化实际上不必要的公共路径。