【问题标题】:How does MomentJS work comparing values with > and < (and >=, <=)?MomentJS 如何将值与 > 和 <(以及 >=、<=)进行比较?
【发布时间】:2014-05-26 00:41:28
【问题描述】:

我在当前项目中使用 moment.js,我看到比较运算符 ,>=,

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

谁能给我一个简短的描述为什么这些工作?是否有可能使 == 也能正常工作?

谢谢。

【问题讨论】:

  • 你能提供一个jsfiddle吗?我猜这个问题也是由日期时间值引起的。通过在日期上使用 getTime() 进行测试,看看它们是否相等。否则,他们可能会比较实际的日期实例,而不是与该日期关联的值。最后尝试使用moment().isSame()

标签: javascript momentjs


【解决方案1】:

这是由于 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(),然后进一步没有优化实际上不必要的公共路径。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2021-04-24
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多