モーメントオブジェクトの初期値を保存する必要があるという問題に遭遇しましたが、元のオブジェクトと一緒に変数が変更されないようにするのに問題があります。
残念ながら、Object.freeze()は機能しません。moment.jsがフォーマットしようとすると、「無効な日付」エラーが返されるためです。
モーメントオブジェクトの初期値を保存する必要があるという問題に遭遇しましたが、元のオブジェクトと一緒に変数が変更されないようにするのに問題があります。
残念ながら、Object.freeze()は機能しません。moment.jsがフォーマットしようとすると、「無効な日付」エラーが返されるためです。
回答:
NPMにはfrozen-momentというMoment.jsプラグインがあります-のmoment().freeze()
代わりに使用できますObject.freeze(moment())
。
それ以外の場合、vanilla Moment.jsには、可変clone
性の問題を回避するのに役立つメソッドがあるため、次のようなことができます。
var a = moment(),
b = a.clone(); // or moment(a)
更新:
この回答を書いてから2年になります。今回、日付を処理するための別のライブラリが浮上し、多くの注目を集めました:https : //date-fns.org/
このライブラリはデフォルトでは不変であり、モジュール式の機能的なアーキテクチャーに準拠しています。つまり、ツリーのシェイクやクライアント側のバンドリングに適しています。クライアント側でWebpackを多用するプロジェクトに取り組んでいて、Moment.jsがビルドに問題を引き起こしている場合、またはMoment.jsの可変性が原因で多くの問題が発生している場合でも、date-fns
試してみる必要があります。
moment
:ちょうど使用クローン()このように:それを変異させずに、変数zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
しばらく使用してきましたが、Momentとboyを使用してレガシーコードにジャンプする必要がありました。この投稿により、ウィンドウからジャンプする必要がなくなりました。
これは私の意図ではないので、恥知らずな自己宣伝のための古い質問と謝罪です。それが誰かを助けることを願っています。
razorbeardの発言(.clone()
など)に加えて、Moment.jsに付属しているものに不変のメソッドを追加するNPMモジュールを作成しました。意図は既存のコードを壊すことではないので、モジュールはImmu
その名前に追加された新しいメソッドを追加します。
モーメントファクトリによって返される各インスタンスは、不変のメソッドで装飾されます。たとえば、moment().startOf()
対応するstartOfImmu()
やadd()
があるaddImmu()
などです。これらの各インスタンスは、既存のモーメントを変更するのではなく、新しいモーメントを返します。これを使用するには、moment
ファクトリをmomentImmutableMethods
に渡して、新しい不変メソッドにアクセスします。例:
var moment = require('moment'); // or moment-timezone
import { momentImmutableMethods } from 'moment-immutable-methods';
// to decorate instances with immutable methods we need to extend moment factory as below:
momentImmutableMethods(moment);
// now every instance returned by moment will have Immu methods attached.
// IMMUTABLE EXAMPLE
// we using immutable methods that were attached to every instance, these have Immu appended to original name
const ddd = moment({
hour: 5,
minute: 10
});
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
const eee = ddd.startOfImmu('day');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === eee);
// false
const fff = eee.startOfImmu('month');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === fff);
// false
console.log(eee === fff);
// false
console.log(ddd.format('DD/MM/YY HH:mma'));
// "14/04/18 05:10am"
console.log(eee.format('DD/MM/YY HH:mma'));
// "14/04/18 00:00am"
console.log(fff.format('DD/MM/YY HH:mma'));
// "08/04/18 00:00am"
https://www.npmjs.com/package/moment-immutable-methodsの NPMにあります