这总是让我感到困惑,而且我认为我应该绕开它,所以有人可以向我解释它以及如何解决它吗?
好,所以即时通讯使用力矩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更改了该对象/变量。我该如何做才能使对原始对象的更改仅用于设置新变量的目的?
这是我永远无法理解的事情,为什么会发生以及如何预防。有人可以解释为什么这样做以及如何防止吗?
答案 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)
答案 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>
我希望这是有道理的。通常,对于像这样的大型库,文档非常好,值得一读。