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

时间:2018-07-24 11:27:01

标签: javascript jquery momentjs

这总是让我感到困惑,而且我认为我应该绕开它,所以有人可以向我解释它以及如何解决它吗?

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

var startOfDiscount = moment('24/07/2018', "DD/MM/YYYY");

为什么当我尝试基于这样的startOfDiscount对象创建一个新变量时

var endOfDiscount = startOfDiscount.add(6, 'months').endOf('month');

那是将我的startOfDiscount对象更改为?我知道行startOfDiscount.add(1, 'months').endOf('month')正在操纵实际的startOfDiscount对象,但是我该怎么做,以便仅出于我的新变量的目的对其进行操作/更改,而原始变量保持不变?

所以如果我跑了

console.log(startOfDiscount);
console.log(endOfDiscount);

它们都打印相同的日期?

当我尝试使用原始对象/变量声明一个新对象时,为什么javascript更改了该对象/变量。我该如何做才能使对原始对象的更改仅用于设置新变量的目的?

这是我永远无法理解的事情,为什么会发生以及如何预防。有人可以解释为什么这样做以及如何防止吗?

3 个答案:

答案 0 :(得分:5)

  

有人可以解释为什么这样做吗……

因为链接的方法以如下方式返回其上下文:

moment.prototype.add = function(n, type) {
  //...
  return this;
};

这使您可以像这样进行链接:

moment().add(1, "months").add(2, "days");

但这也意味着startOfDiscount.add(1, "months")的值为startOfDiscount,因此,如果将其赋值给另一个变量,则会得到对同一对象的两个引用。

  

...以及如何预防?

只需创建一个新的矩对象,然后对其进行突变即可

var endOfDiscount = moment(startOfDiscount).add(6, 'months').endOf('month');

答案 1 :(得分:3)

您必须像

一样克隆它
var endOfDiscount = startOfDiscount.clone().add...

选中此https://momentjs.com/guides/

答案 2 :(得分:2)

您正确地更改了原件,尽管这是设计使然。这是指向documentation

的链接
  

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

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

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

如果要基于旧变量创建新变量,则首先必须clone

  

创建一个持续时间的副本。持续时间是可变的,就像瞬间对象一样,因此可以在某个时间点获取快照。

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

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

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

https://momentjs.com/docs/