순간 객체의 초기 값을 저장해야하는 문제가 발생했지만 내 변수가 원래 객체와 함께 변경되는 것을 막는 데 문제가 있습니다.
불행히도 Object.freeze ()는 작동하지 않습니다. 형식을 지정하려고 할 때 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
시도 해야 합니다.
moment
변경하지 않고 저장된 변수를 조작 할 수 있습니다 . 다음과 같이 clone ()을 사용하십시오.zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
하고 있었지만 그 이후로 Moment와 boy를 사용하여 레거시 코드로 뛰어 들어야했습니다.이 게시물은 나를 창 밖으로 뛰어 내리는 것을 구했습니다.
dayjs
불변의 특성을 가진 Moment.js와 유사한 API를 가지고 있기 때문에 좋은 대안입니다. (2019 년 3 월 현재 시간대 지원이 부족하지만 이것은 상당히 새로운 라이브러리이며 작업이 진행중인 것을 볼 수 있습니다.)
내 의도가 아니기 때문에 뻔뻔한 자기 홍보에 대한 오래된 질문과 사과입니다. 누군가를 도울 수 있기를 바랍니다.
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"