Tive um problema em que preciso armazenar os valores iniciais de um objeto de momento, mas estou tendo alguns problemas para evitar que minha variável mude junto com o objeto original.
Infelizmente Object.freeze () não funciona, porque moment.js retorna um erro de "Data inválida" quando tento formatar isso.
javascript
object
immutability
momentjs
mutability
Shengbo1618
fonte
fonte
Respostas:
Há um plugin Moment.js no NPM chamado frozen-moment - você pode usar
moment().freeze()
no lugar deObject.freeze(moment())
.Caso contrário, vanilla Moment.js tem um
clone
método que deve ajudá-lo a evitar problemas de mutabilidade, então você pode fazer algo assim:ATUALIZAR:
Já se passaram dois anos desde que escrevi esta resposta. Nesse tempo, outra biblioteca para trabalhar com datas surgiu e ganhou muita força: https://date-fns.org/
Essa biblioteca é imutável por padrão e segue uma arquitetura modular e funcional, o que significa que é mais adequada para agitação de árvore e empacotamento do lado do cliente. Se você está trabalhando em um projeto que faz uso extensivo de Webpack no lado do cliente e descobre que Moment.js está causando problemas com sua construção, ou mesmo se a mutabilidade do Moment.js está causando muita dor de cabeça, então você deve dar
date-fns
uma chance.fonte
moment
variável armazenada sem alterá-la: basta usar clone () assim:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
por um tempo, mas desde então tive que pular para o código legado usando o Moment e cara, esse post me salvou de pular de uma janela.dayjs
também é uma boa alternativa, pois tem APIs semelhantes a Moment.js com natureza imutável. (Em março de 2019, ela não tinha suporte de fuso horário, mas esta é uma biblioteca relativamente nova e posso observar que o trabalho está em andamento.)É uma velha pergunta e desculpas pela autopromoção sem vergonha pois essa não é a minha intenção, só espero que ajude alguém.
Além do que diz razorbeard (
.clone()
etc), criei um módulo NPM que anexa métodos imutáveis a tudo o que o Moment.js vem pronto para uso. A intenção não é quebrar o código existente, então o módulo adiciona novos métodos comImmu
anexado ao seu nome.Cada instância retornada pela fábrica de momento será decorada com métodos imutáveis, por exemplo
moment().startOf()
, terá correspondentestartOfImmu()
,add()
teráaddImmu()
etc. Cada um desses retorna um novo momento ao invés de modificar um existente. Para usá-lo, basta passar demoment
fábricamomentImmutableMethods
para obter acesso a novos métodos imutáveis. Exemplo:Está no NPM em https://www.npmjs.com/package/moment-immutable-methods
fonte