【问题标题】:JavaScript instanceof and moment.jsJavaScript instanceof 和 moment.js
【发布时间】:2015-08-10 13:35:56
【问题描述】:

我正在尝试理解 JavaScript 世界中的类型。我的页面正在使用moment.js。我有一个函数,有时会返回 moment(),有时会返回 string(它是旧代码变得疯狂)。

我的代码如下所示:

var now = getDate();
if (now instanceof moment) {
  console.log('we have a moment.');
} else {
  console.log('we have a string.');
}


function getDate() {
  var result = null;
  // Sometimes result will be a moment(), other times, result will be a string.
  result = moment();
  return result;
}

当我执行上面的代码时,我从来没有得到we have a moment.。即使我手动设置result = moment();。这是为什么?我是误会instanceof 还是moment

【问题讨论】:

  • 尝试打印“type of moment()”以确保您期待正确的值。
  • 尝试使用 typeof,并调试:console.log(typeof now);
  • 应该使用typeof now === "string"

标签: javascript momentjs


【解决方案1】:

Moment 版本 2.13.0

有一个静态方法.isMoment

【讨论】:

    【解决方案2】:

    首先,instanceof 并不完全可靠。

    其次,moment() 返回不向用户公开的Moment 类的实例。以下代码证明了这一点:

    moment().__proto__.constructor // function Moment()
    moment().constructor === moment; // false
    

    第三,moment 提供函数moment.isMoment 可以解决您的问题。

    最后,但同样重要的是 - 您的代码应该使用一致的返回类型 - 始终返回 moment 实例或始终返回字符串。它会减少你未来的痛苦。

    您可以通过调用 moment 函数来确保您始终拥有 moment 实例 - moment(string) 的值等于 moment(moment(string)),因此您始终可以将您的参数转换为 moment 实例。

    【讨论】:

    • 你不应该检查moment().constructor === moment吗?
    • 我认为这已经过时了。 isMoment 未定义。此外,isMoment()(或isValid(),我认为是当前的等价物)和 typeof/instanceof 之间的差异在适当的情况下可能相当显着。
    • 你应该调用 moment.isMoment(moment()) 而不是 moment().isMoment()。
    • The docs 说:“从 2.11.0 版本开始,您还可以通过 instanceof 运算符测试时刻对象:moment() instanceof moment // true”
    • 我正在向我的朋友证明 js 能够为 instanceof 提供错误的值,并且确实如此。我用 JS 编写代码,但有时这些小东西让人觉得它不太可靠。
    猜你喜欢
    • 2015-02-22
    • 2012-07-24
    • 1970-01-01
    • 2013-03-19
    • 2011-02-25
    • 2013-01-12
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多