Я столкнулся с проблемой, когда мне нужно сохранить начальные значения объекта момента, но у меня возникли проблемы с предотвращением изменения моей переменной вместе с исходным объектом.
К сожалению, Object.freeze () не работает, потому что moment.js возвращает ошибку «Недопустимая дата», когда я пытаюсь ее отформатировать.
javascript
object
immutability
momentjs
mutability
Шэнбо1618
источник
источник
Ответы:
В NPM есть плагин Moment.js под названием frozen-moment - вы можете использовать
moment().freeze()
вместоObject.freeze(moment())
.В противном случае в vanilla Moment.js есть
clone
метод, который должен помочь вам избежать проблем с изменчивостью, поэтому вы можете сделать что-то вроде этого:ОБНОВИТЬ:
Прошло два года с тех пор, как я написал этот ответ. В это время появилась еще одна библиотека для работы с датами, которая получила широкое распространение: https://date-fns.org/
Эта библиотека по умолчанию неизменяема и следует модульной функциональной архитектуре, что означает, что она лучше подходит для встряхивания дерева и связывания на стороне клиента. Если вы работаете над проектом, который широко использует Webpack на стороне клиента, и обнаруживаете, что Moment.js доставляет вам проблемы с вашей сборкой, или даже если изменчивость Moment.js вызывает у вас много головной боли, тогда вы следует
date-fns
попробовать.источник
moment
переменной, не изменяя ее: просто используйте clone () следующим образом:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
некоторое время использую, но с тех пор мне пришлось перейти на устаревший код, используя Moment, и мальчик, этот пост спас меня от выпрыгивания из окна.dayjs
также является хорошей альтернативой, поскольку у него есть API-интерфейсы, подобные Moment.js, с неизменной природой. (По состоянию на март 2019 года в нем отсутствует поддержка часовых поясов, но это довольно новая библиотека, и я могу наблюдать, что работа продолжается.)Это старый вопрос, и извинения за бесстыдную саморекламу, поскольку это не мое намерение, просто надеюсь, что это кому-то поможет.
В дополнение к тому, что говорит razorbeard (и
.clone()
т. Д.), Я создал модуль NPM, который присоединяет неизменяемые методы ко всему, что Moment.js поставляется из коробки. Цель состоит в том, чтобы не нарушать существующий код, поэтому модуль добавляет новые методы сImmu
добавлением к его имени.Каждый экземпляр, возвращаемый фабрикой моментов, будет украшен неизменяемыми методами, например,
moment().startOf()
будет иметь соответствующиеstartOfImmu()
,add()
будут иметьaddImmu()
и т. Д. Каждый из них возвращает новый момент, а не изменяет существующий. Чтобы использовать его, просто передайтеmoment
factory,momentImmutableMethods
чтобы получить доступ к новым неизменяемым методам. Пример:Его на NPM по адресу https://www.npmjs.com/package/moment-immutable-methods
источник