繁体   English   中英

我如何解决 moment.js 中的可变性?

[英]How do I work around mutability in moment.js?

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

不幸的是 Object.freeze() 不起作用,因为当我尝试格式化时,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/

默认情况下,该库是不可变的,并遵循模块化的功能架构,这意味着它更适合于摇树和客户端捆绑。 如果你正在开发一个在客户端大量使用 Webpack 的项目,并且发现 Moment.js 给你的构建带来了麻烦,或者即使 Moment.js 的可变性让你很头疼,那么你应该试试date-fns

这是一个老问题,为无耻的自我宣传道歉,因为这不是我的本意,只是希望它会帮助某人。

除了 razorbeard 所说的( .clone()等),我创建了 NPM 模块,该模块将不可变的方法附加到开箱即用的 Moment.js。 目的不是破坏现有代码,因此模块添加了新方法,并在其名称后附加了Immu

时刻工厂返回的每个实例都将使用不可变方法进行修饰,例如, moment().startOf()将具有相应的startOfImmu()add()将具有addImmu()等。每一个都返回新的时刻而不是修改现有的时刻。 要使用它,只需将moment factory 传递给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 完全相同,但不可变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM