[javascript] moment.js에서 변경 가능성을 어떻게 해결합니까?

순간 객체의 초기 값을 저장해야하는 문제가 발생했지만 내 변수가 원래 객체와 함께 변경되는 것을 막는 데 문제가 있습니다.

불행히도 Object.freeze ()는 작동하지 않습니다. 형식을 지정하려고 할 때 moment.js가 “잘못된 날짜”오류를 반환하기 때문입니다.



답변

frozen-moment 라는 NPM에 Moment.js 플러그인 이 있습니다 moment().freeze(). 대신 사용할 수 있습니다 Object.freeze(moment()).

그렇지 않으면 바닐라 Moment.js에는 clone가변성 문제를 피하는 데 도움 이되는 메서드가 있으므로 다음과 같이 할 수 있습니다.

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

최신 정보:

이 답변을 쓴 지 2 년이 지났습니다. 이때 날짜 작업을위한 또 다른 라이브러리가 등장하여 많은 관심을 끌었습니다. https://date-fns.org/

이 라이브러리는 기본적으로 불변이며 모듈 식 기능 아키텍처를 따르므로 트리 쉐이킹 및 클라이언트 측 번들링에 더 적합합니다. 클라이언트 측에서 Webpack을 광범위하게 사용하는 프로젝트에서 작업 중이고 Moment.js가 빌드에 문제를 일으키는 것을 발견하거나 Moment.js의 가변성이 많은 골칫거리를 유발하더라도 date-fns시도 해야 합니다.


답변

내 의도가 아니기 때문에 뻔뻔한 자기 홍보에 대한 오래된 질문과 사과입니다. 누군가를 도울 수 있기를 바랍니다.

razorbeard가 말하는 것 외에도 (.clone() Moment.js가 기본적으로 제공되는 모든 것에 불변 메서드를 연결하는 NPM 모듈을 만들었습니다. 의도는 기존 코드를 깨뜨리는 것이 아니므로 모듈 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


답변