我遇到了一个问题,我必须存储时刻对象的初始值,但是在阻止我的变量与原始对象一起更改时遇到了一些麻烦。
不幸的是Object.freeze()
,它不起作用,因为Invalid date
当我尝试格式化时,moment.js 返回一个错误。
我遇到了一个问题,我必须存储时刻对象的初始值,但是在阻止我的变量与原始对象一起更改时遇到了一些麻烦。
不幸的是Object.freeze()
,它不起作用,因为Invalid date
当我尝试格式化时,moment.js 返回一个错误。
NPM 上有一个 Moment.js 插件,名为 freeze -moment - 你可以使用moment().freeze()
.Object.freeze(moment())
否则,vanilla Moment.js 有一个clone
方法可以帮助您避免可变性问题,因此您可以执行以下操作:
var a = moment(),
b = a.clone(); // or moment(a)
更新:
我写这个答案已经两年了。在这个时候,另一个处理日期的库已经浮出水面并获得了很大的关注:https ://date-fns.org/
默认情况下,该库是不可变的,并且遵循模块化的功能架构,这意味着它更适合于 tree-shaking 和客户端捆绑。如果你正在开发一个在客户端广泛使用 Webpack 的项目,并且发现 Moment.js 给你的构建带来了麻烦,或者即使 Moment.js 的可变性让你很头疼,那么你应该date-fns
试一试。
这是一个老问题,为无耻的自我推销道歉,因为这不是我的意图,只是希望它对某人有所帮助。
除了 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
您还可以使用day.js库,它几乎具有 moment.js 的 API,但它是不可变的。