Como testar se uma variável é um objeto Moment.js?

92

Meu aplicativo tem um formulário HTML com algumas entradas preenchidas do back-end e outras entradas sendo inseridas pelo usuário (em uma timeentrada). Uma onChangefunção é executada em cada entrada quando o usuário altera um valor.

As entradas preenchidas do backend são convertidas em momentobjetos, as datas inseridas pelo usuário são meras strings. Isso significa que a onChangefunção encontra alguns momentobjetos e algumas strings. Preciso saber quais entradas são momentobjetos e quais não são.

Qual é o método recomendado para testar se uma variável é um momentobjeto?

Percebi que os momentobjetos têm uma _isAMomentObjectpropriedade, mas estou me perguntando se há outra maneira de testar se uma variável é um momentobjeto.

Outra opção que tentei foi chamar momenta variável independentemente. Isso converte as stringvariáveis ​​em momentobjetos e não parece afetar os momentobjetos existentes .

Brett DeWoody
fonte

Respostas:

95

O Moment tem um isMomentmétodo exatamente para esse propósito. Não é muito fácil encontrá-lo nos documentos, a menos que você saiba o que procurar.

Ele primeiro verifica instanceofe, em seguida, falhando (por exemplo, em certas situações de subclasse ou cross-realm) ele testará a _isAMomentObjectpropriedade.

Jared Smith
fonte
e se não for fortemente tipado? moment.isMoment (entrada);
Don Thomas Boyle
3
@DonThomasBoyle isso é JavaScript: não existe uma digitação forte. 'Forte' é um termo meio ambíguo para digitação, mas por praticamente qualquer definição possível (exceto talvez a segurança da memória) os tipos JS são fracos. A única maneira de fazer isso explodir é se inputé nullou undefined, literalmente, qualquer objeto JS não nulo ou mesmo um valor primitivo retornará apenas um booleano.
Jared Smith
34

Você pode verificar se é um instanceofmomento:

moment() instanceof moment; // true
Niels Heisterkamp
fonte
6
Somente se a instância e o próprio momento estiverem na mesma janela.
JAAulde
1
Isso sempre é verdade, porque moment () sempre criaria um objeto de momento. Em vez disso, você quis dizer "obj instanceof moment;" ?
NoBrainer
3

moment () instanceof moment;

sempre será verdade, porque se você tiver

  • momento (indefinido) instância de momento
  • momento ("olá") instância do momento

você está sempre criando um objeto de momento. Então, a única maneira é verificar assim

  • momento (propriedade) .isValid ()
Fabien Sartori
fonte