Js 内部对象什么是“_d”vs“_i”

我使用 Moment.js 并使用 moment.hour(xx) moment.minute(xx)操作日期。

当我看到物体包含 _d_i的时候: _d包含了正确的改变的 moment.hour()或者 moment.minute()的改变,但是 _i对象包含了原始的?

k {_isAMomentObject: true, _i: Thu Dec 11 2014 20:34:00 GMT+0200 (South Africa Standard Time), _isUTC: false, _pf: Object, _locale: j…}
_d: Thu Dec 11 2014 14:00:00 GMT+0200
_i: Thu Dec 11 2014 20:34:00 GMT+0200

有人能告诉我吗?

58083 次浏览

别理他们。使用各种输出函数,例如 .format()请参阅 Moment.js 关于此主题的指导.简而言之,所有以下划线(_)作为前缀的字段都应该被视为禁区。

由于 Date对象的工作方式,现在内部结构有一些怪异之处。公共 API 中的所有函数都考虑到了它们,但是您可能不想自己解决这些问题。

为了完整起见,我将详细说明它们的用途:

  • _i是创建 moment对象时使用的 输入。它可以是字符串、数字、数组或 Date对象。

    但是,如果传入另一个 moment对象,则 _i将被复制到该时刻 _i,其他属性也将被复制。_i永远不会是 moment对象。

    在使用 moment()创建当前矩的情况下,_i也可以是未定义的。

  • _d是支持 moment对象的 Date对象的实例。

    如果您处于“本地模式”,那么 _d将具有与通过公共 API 显示的 moment 对象相同的本地日期和时间。由 getTimevalueOf返回的时间戳也将匹配。

    如果您处于“ UTC 模式”,那么 _d将仍然拥有与使用公共 API 显示的瞬间对象相同的 协调世界时日期和时间。这可能会令人困惑,因为您需要在 _d上查看 getUTCDate和其他基于 UTC 的函数,以查看它们是否匹配。时间戳也会在这里匹配。

    如果使用 utcOffsetzonetz函数更改了时区偏移量,则 _d值为 不能单独行动。它还必须考虑是否定义了 _offset。如果是,那么支持 _d对象的时间戳必须首先根据偏移量进行调整。您可以在 valueOf方法 给你的实现中看到这种行为。

    另外,如果您在应用不同的偏移量或时区时查看 _d的字符串输出,那么 _d将使用 本地时区。但是,转换到本地时间只是 Date对象的 toString函数的一个副作用。矩在其函数中不使用该结果。

这是当前版本(我写这篇文章时是2.10.6)中这两个字段的行为。但是,还有其他字段,因为这些字段是 内部字段,所以在将来的版本中行为完全有可能发生变化。特别是,请参见 第2616期

作为@Matt 回答的补充:

检查这个结果从铬的控制台:

Date1是瞬间的有效对象:

如你所见。我不知道。我有不同的价值观。因此,您最好在源代码中使用 format ()函数(如@Matt Johnson 所写)。