JavaScript instanceof和moment.js

Som*_*ser 31 javascript momentjs

我试图理解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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*man 42

片刻版本2.13.0

有一个静态方法.isMoment:

在此输入图像描述


Gin*_*den 35

首先,instanceof并非完全可靠.

其次,moment()返回Moment未向用户公开的类的实例.以下代码证明:

moment().__proto__.constructor // function Moment()
moment().constructor === moment; // false
Run Code Online (Sandbox Code Playgroud)

第三,moment提供moment.isMoment解决问题的功能.

最后,但并非最不重要 - 您的代码应使用一致的返回类型 - 始终返回moment实例或始终返回字符串.它会减少你将来的痛苦.

您可以moment通过调用moment函数来确保始终拥有实例- moment(string)值为equals moment(moment(string)),这样您就可以随时将参数转换为moment实例.

  • 我认为这已经过时了.`isMoment`未定义.另外,`isMoment()`(或`isValid()`,我认为是当前的等价物)和typeof/instanceof之间的区别在适当的情况下可能相当重要. (2认同)
  • 你应该调用moment.isMoment(moment())而不是moment().isMoment(). (2认同)
  • [文档](https://momentjs.com/docs/)说:“从版本2.11.0开始,您还可以通过instanceof运算符测试一下矩对象:moment()instanceof moment // true” (2认同)