Ich bin auf ein Problem gestoßen, bei dem ich die Anfangswerte eines Momentobjekts speichern muss, aber ich habe Probleme, zu verhindern, dass sich meine Variable zusammen mit dem ursprünglichen Objekt ändert.
Leider funktioniert Object.freeze () nicht, da moment.js einen Fehler "Ungültiges Datum" zurückgibt, wenn ich versuche, dies zu formatieren.
javascript
object
immutability
momentjs
mutability
Shengbo1618
quelle
quelle
Antworten:
Es gibt ein Moment.js-Plugin auf NPM namens Frozen-Moment - Sie können es
moment().freeze()
anstelle von verwendenObject.freeze(moment())
.Andernfalls verfügt vanilla Moment.js über eine
clone
Methode, mit der Sie Veränderbarkeitsprobleme vermeiden können. Sie können also Folgendes tun:AKTUALISIEREN:
Es ist zwei Jahre her, seit ich diese Antwort geschrieben habe. In dieser Zeit ist eine andere Bibliothek für die Arbeit mit Datumsangaben aufgetaucht und hat viel Anklang gefunden: https://date-fns.org/
Diese Bibliothek ist standardmäßig unveränderlich und folgt einer modularen, funktionalen Architektur, was bedeutet, dass sie besser für das Schütteln von Bäumen und das clientseitige Bündeln geeignet ist. Wenn Sie an einem Projekt arbeiten, das Webpack auf der Clientseite in großem Umfang nutzt, und feststellen, dass Moment.js Probleme mit Ihrem Build verursacht, oder wenn die Veränderlichkeit von Moment.js Ihnen große Kopfschmerzen bereitet, dann haben Sie Probleme sollte es
date-fns
versuchen.quelle
moment
Variablen manipulieren , ohne sie zu mutieren: Verwenden Sie einfach clone () wiezz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
jetzt schon eine Weile, musste aber seitdem mit Moment und Boy in alten Code springen. Hat mich dieser Beitrag davor bewahrt, aus einem Fenster zu springen?dayjs
ist auch eine gute Alternative, da es APIs ähnlich wie Moment.js mit unveränderlicher Natur hat. (Ab März 2019 fehlt die Zeitzonenunterstützung, aber dies ist eine ziemlich neue Bibliothek, und ich kann beobachten, dass die Arbeit noch nicht abgeschlossen ist.)Es ist eine alte Frage und Entschuldigung für schamlose Eigenwerbung, da dies nicht meine Absicht ist, hoffe nur, dass es jemandem hilft.
Zusätzlich zu dem, was razorbeard sagt (
.clone()
usw.), habe ich ein NPM-Modul erstellt, das unveränderliche Methoden an alle Moment.js anfügt, die standardmäßig mitgeliefert werden. Der vorhandene Code soll nicht beschädigt werden, daher fügt das Modul neue Methoden hinzu,Immu
die an seinen Namen angehängt werden.Jede Instanz, die von der Momentfabrik zurückgegeben wird, wird mit unveränderlichen Methoden dekoriert, z. B.
moment().startOf()
hat entsprechendestartOfImmu()
,add()
hataddImmu()
usw. Jede dieser Instanzen gibt einen neuen Moment zurück, anstatt den vorhandenen zu ändern. Um es zu verwenden, übergeben Sie einfach diemoment
FactorymomentImmutableMethods
, um Zugriff auf neue unveränderliche Methoden zu erhalten. Beispiel:Es ist auf NPM unter https://www.npmjs.com/package/moment-immutable-methods
quelle