这是一直让我困惑的事情,我想是时候我开始思考这个问题了,所以有人可以向我解释一下它以及如何解决它吗?
好的,所以我使用 moment 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 会更改原始对象/变量。我该如何做才能使对原始对象的更改仅用于设置新变量?
这是我一直无法理解为什么会发生以及如何预防它的事情。有人可以解释为什么会这样做以及如何防止它吗?
最佳答案
你说得对,它改变了原来的内容,尽管这是设计使然。这是documentation的链接
Mutates the original moment by adding time.
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它。
Create a clone of a duration. Durations are mutable, just like moment objects, so this lets you get a snapshot, at some point in time.
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>
我希望这是有道理的。一般来说,对于像这样的大型库,文档非常好并且值得一读。
关于javascript - 将 Moment JS 对象设置为新变量时更新它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497420/