JavaScript instanceof et moment.js

J'essaie de comprendre les types dans le monde JavaScript. Ma page utilise moment.js . J'ai une fonction qui renvoie parfois un moment() et d'autres fois, renvoie un string (c'est le code hérité qui est devenu sauvage).

Mon code ressemble à ceci:

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;
}

Quand j'exécute le code ci-dessus, je n'obtiens jamais we have a moment.. Même si je fais manuellement set result = moment();. Pourquoi est-ce? Suis-je un malentendu instanceof ou moment?

26
demandé sur AST 2015-08-10 16:35:56

2 réponses

Tout d'Abord, instanceof n'est pas parfaitement fiable.

Deuxièmement, moment() renvoie une instance de la classe Moment qui n'est pas exposée à l'utilisateur. Le code suivant prouve ceci:

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

Troisièmement, moment fournissez une fonction moment.isMoment qui résoudra votre problème.

Et enfin, mais non des moindres - votre code doit utiliser des types de retour cohérents - toujours renvoyer des instances moment ou toujours renvoyer des chaînes. Il permettra de réduire votre douleur à l'avenir.

, vous pouvez Vous assurer que vous avez toujours moment exemple par l'appel de moment function - moment(string) est égale à la valeur moment(moment(string)), de sorte que vous pouvez toujours convertir votre argument moment exemple.

31
répondu Ginden 2016-05-12 11:00:45

Moment Version 2.13.0

Il existe une méthode statique .isMoment:

entrez la description de l'image ici

36
répondu FreeLightman 2016-08-05 11:05:12