Me he encontrado con un problema en el que tengo que almacenar los valores iniciales de un objeto de momento, pero tengo problemas para evitar que mi variable cambie junto con el objeto original.
Desafortunadamente, Object.freeze () no funciona, porque moment.js devuelve un error de "Fecha no válida" cuando intento formatear eso.
javascript
object
immutability
momentjs
mutability
Shengbo1618
fuente
fuente
Respuestas:
Hay un complemento Moment.js en NPM llamado momento congelado : puede usar
moment().freeze()
en lugar deObject.freeze(moment())
.De lo contrario, vanilla Moment.js tiene un
clone
método que debería ayudarlo a evitar problemas de mutabilidad, por lo que podría hacer algo como esto:ACTUALIZAR:
Han pasado dos años desde que escribí esta respuesta. En este momento, ha surgido otra biblioteca para trabajar con fechas y ha ganado mucha tracción: https://date-fns.org/
Esta biblioteca es inmutable de forma predeterminada y sigue una arquitectura modular y funcional, lo que significa que se adapta mejor a la agitación de árboles y la agrupación del lado del cliente. Si está trabajando en un proyecto que hace un uso extensivo de Webpack en el lado del cliente y descubre que Moment.js le está causando problemas con su compilación, o incluso si la mutabilidad de Moment.js le está causando muchos dolores de cabeza, entonces debería
date-fns
intentarlo.fuente
moment
variable almacenada sin mutarla: simplemente use clone () así:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
durante un tiempo, pero desde entonces tuve que saltar al código heredado usando Moment y, vaya, ¿esta publicación me salvó de saltar por una ventana?dayjs
También es una buena alternativa ya que tiene APIs similares a Moment.js con naturaleza inmutable. (A partir de marzo de 2019, carece de soporte de zona horaria, pero esta es una biblioteca bastante nueva y puedo observar que el trabajo está en curso).Es una vieja pregunta y disculpas por la autopromoción descarada, ya que esta no es mi intención, solo espero que ayude a alguien.
Además de lo que dice razorbeard (
.clone()
etc.), creé un módulo NPM que adjunta métodos inmutables a lo que sea que Moment.js venga de fábrica. La intención no es romper el código existente, por lo que el módulo agrega nuevos métodos con unImmu
apéndice a su nombre.Cada instancia devuelta por la fábrica de momentos se decorará con métodos inmutables, por ejemplo
moment().startOf()
, tendrá el correspondientestartOfImmu()
,add()
tendrá ,addImmu()
etc. Cada uno de ellos devuelve un nuevo momento en lugar de modificar el existente. Para usarlo, simplemente pase demoment
fábrica amomentImmutableMethods
para obtener acceso a nuevos métodos inmutables. Ejemplo:Está en NPM en https://www.npmjs.com/package/moment-immutable-methods
fuente