我遇到了一个问题,我必须存储一个时刻对象的初始值但是我在防止我的变量与原始对象一起变化时遇到了一些麻烦。
不幸的是,Object.freeze()不起作用,因为moment.js会返回一个"无效的日期"我尝试格式化时出错。
答案 0 :(得分:137)
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
。
答案 1 :(得分:2)
这是一个古老的问题,并为无耻的自我推销道歉,因为这不是我的意图,只希望它会帮助某人。
除了razorbeard所说的(.clone()
等)之外,我还创建了NPM模块,它将不可变方法附加到开箱即用的Moment.js中。目的不是破坏现有代码,因此模块添加了新名称,其名称附加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"
它在NPM https://www.npmjs.com/package/moment-immutable-methods
答案 2 :(得分:0)
如果您喜欢更不可变的代码,也可以使用软件包frozen-moment。
答案 3 :(得分:0)
您还可以使用day.js库,该库几乎具有moment.js的完全相同的API,但是不可变。