我如何处理瞬间的可变性 js?

我遇到了一个问题,我必须存储矩对象的初始值,但我有一些麻烦,防止我的变量随着原始对象的变化。

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

51034 次浏览

NPM 上有一个 Moment.js 插件叫做 定格时刻-你可以用 moment().freeze()代替 Object.freeze(moment())

否则,香草 Moment.js 有一个 clone方法,可以帮助您避免可变性问题,所以您可以这样做:

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

更新:

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

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

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

此外,我还创建了 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"

这是 https://www.npmjs.com/package/moment-immutable-methods台的 NPM 节目

您还可以使用 Day Js库,它几乎具有 Moment.js 的完全 API,但是是不可变的。