Как проверить, является ли переменная объектом Moment.js?

93

В моем приложении есть HTML-форма, в которой некоторые входные данные заполняются из бэкэнда, а другие входные данные вводятся пользователем (во timeвходных данных). onChangeФункция проходит через каждый вход , когда пользователь изменяет значение.

Входные данные, заполненные серверной частью, преобразуются в momentобъекты, а даты, введенные пользователем, представляют собой простые строки. Это означает, что onChangeфункция встречает некоторые momentобъекты и некоторые строки. Мне нужно знать, какие входы являются momentобъектами, а какие нет.

Какой рекомендуемый метод проверки является ли переменная momentобъектом?

Я заметил, что у momentобъектов есть _isAMomentObjectсвойство, но мне интересно, есть ли другой способ проверить, является ли переменная momentобъектом.

Другой вариант, который я пробовал, - momentэто независимо от вызова переменной. Это преобразует stringпеременные в momentобъекты и, похоже, не влияет на существующие momentобъекты.

Бретт ДеВуди
источник

Ответы:

98

У Moment есть isMomentметод именно для этой цели. Его не так просто найти в документации, если вы не знаете, что искать.

Сначала он проверяет, instanceofа затем, если это не удается (например, в определенных ситуациях подкласса или перекрестных областей), он проверит _isAMomentObjectсвойство.

Джаред Смит
источник
что, если он не строго типизирован? moment.isMoment (ввод);
Дон Томас Бойл
3
@DonThomasBoyle, это JavaScript: строгой типизации нет. «Сильный» - это своего рода двусмысленный термин для типизации, но практически по любому возможному определению (кроме, возможно, безопасности памяти) типы JS являются слабыми. Единственный способ получить такой взрыв - это if inputis nullor undefined, буквально любой ненулевой объект JS или даже примитивное значение просто вернет логическое значение.
Джаред Смит,
35

Вы можете проверить, момент ли это instanceof:

moment() instanceof moment; // true
Нильс Хайстеркамп
источник
6
Только если экземпляр и сам момент находятся в одном окне.
JAAulde
2
Это всегда верно, потому что moment () всегда создает объект момента. Возможно, вы имели в виду "obj instanceof moment;" ?
NoBrainer
Опасность использования instanceof заключается в том, что экземпляр может быть создан из одной зависимости момента, но будет проверять функцию момента из другой зависимости. Т.е. это сломается, если код, создавший объект момента, использовал другую функцию создания, чем код, который тестирует. Примером, когда это может произойти, является то, что код, запускающий вышеуказанный тест, находится в отдельном пакете npm, который зависит от другой версии момента.
Хенрик Ханссон,
3

момент () экземпляр момента;

всегда будет правдой, потому что если у вас есть

  • момент (неопределенный) экземпляр момента
  • момент ("привет") instanceof момент

вы всегда создаете моментальный объект. Так что единственный способ - это проверить вот так

  • момент (свойство) .isValid ()
Фабьен Сартори
источник