Moment JS对象在将它们设置为新变量时进行更新

S_R*_*S_R 0 javascript jquery momentjs

这一直困扰着我,我认为它的时间我已经掌握了它,所以有人可能会向我解释它以及如何解决它?

好吧,所以即时通讯使用片刻JS创建一个时间对象,就像这样

var startOfDiscount = moment('24/07/2018', "DD/MM/YYYY");
Run Code Online (Sandbox Code Playgroud)

当我尝试根据我的startOfDiscount对象创建一个新变量时,为什么呢?

var endOfDiscount = startOfDiscount.add(6, 'months').endOf('month');
Run Code Online (Sandbox Code Playgroud)

那改变了我的startOfDiscount对象?我知道这条线startOfDiscount.add(1, 'months').endOf('month')正在操纵实际的startOfDiscount对象,但是我该如何操作以便它只为我的新变量操作/更改,并且原始变量保持不变?

所以,如果我跑了

console.log(startOfDiscount);
console.log(endOfDiscount);
Run Code Online (Sandbox Code Playgroud)

他们都打印相同的日期?

当我尝试使用它来声明一个新对象/变量时,为什么javascript会更改原始对象/变量.我该怎么做才能对原始对象的更改仅用于设置我的新变量?

这是我从来没有理解为什么会发生以及如何防止它的事情.有人可能会解释为什么会这样做以及如何预防它?

And*_*one 6

你是正确的,它改变了原来的,尽管这是设计使然。这是文档的链接

通过添加时间来改变原始时刻。

var startOfDiscount = moment('24/07/2018', "DD/MM/YYYY");
var endOfDiscount = startOfDiscount.add(6, 'months').endOf('month');

console.log(startOfDiscount);
console.log(endOfDiscount);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果你想根据旧变量创建一个新变量,你首先必须克隆它。

创建持续时间的克隆。持续时间是可变的,就像时刻对象一样,因此这可以让您在某个时间点获得快照。

var startOfDiscount = moment('24/07/2018', "DD/MM/YYYY");
var endOfDiscount = startOfDiscount.clone().add(6, 'months').endOf('month');

console.log(startOfDiscount);
console.log(endOfDiscount);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的。一般来说,像这样的大型库,文档非常好,值得一读。

https://momentjs.com/docs/


Jon*_*lms 5

有人可能会解释为什么会这样做......

因为链式方法返回它们的上下文,如下所示:

moment.prototype.add = function(n, type) {
  //...
  return this;
};
Run Code Online (Sandbox Code Playgroud)

这允许你做链接像:

moment().add(1, "months").add(2, "days");
Run Code Online (Sandbox Code Playgroud)

但它也意味着startOfDiscount.add(1, "months")求值startOfDiscount,所以如果你将它赋给另一个变量,你有两个对同一个对象的引用.

......请问如何预防?

只需创建一个新的时刻对象,然后改变:

var endOfDiscount = moment(startOfDiscount).add(6, 'months').endOf('month');
Run Code Online (Sandbox Code Playgroud)