如何立即解决可变性.js?

我遇到了一个问题,我必须存储时刻对象的初始值,但我遇到了一些麻烦,阻止我的变量与原始对象一起变化。

不幸的是不起作用,因为当我尝试格式化它时.js moment返回错误。Object.freeze()Invalid date


答案 1

NPM上有一个名为frozen-moment的moment.js插件 - 您可以使用代替.moment().freeze()Object.freeze(moment())

否则,vanilla Moment.js有一个方法可以帮助您避免可变性问题,因此您可以执行以下操作:clone

var a = moment(),
    b = a.clone(); // or moment(a)

更新:

自从我写这个答案以来,已经过去了两年。在这段时间里,另一个用于处理日期的库已经浮出水面,并获得了很多牵引力:https://date-fns.org/

默认情况下,此库是不可变的,并且遵循模块化的功能体系结构,这意味着它更适合树摇动和客户端捆绑。如果您正在处理一个在客户端广泛使用Webpack的项目,并且发现Moment.js给您的构建带来了麻烦,或者即使Moment.js的可变性给您带来了很多麻烦,那么您应该尝试一下。date-fns


答案 2

这是一个古老的问题,并为无耻的自我推销道歉,因为这不是我的本意,只是希望它能帮助某人。

除了剃刀胡子所说的(等)之外,我还创建了NPM模块,该模块将不可变的方法附加到开箱即用的任何Moment.js。其目的不是破坏现有代码,因此模块会添加新方法并附加到其名称中。.clone()Immu

时刻工厂返回的每个实例都将使用不可变方法进行修饰,例如将具有相应的 ,将具有等。其中每个都返回新时刻,而不是修改现有时刻。要使用它,只需将工厂传递到即可访问新的不可变方法。例:moment().startOf()startOfImmu()add()addImmu()momentmomentImmutableMethods

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"

它在NPM上 https://www.npmjs.com/package/moment-immutable-methods