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会更改原始对象/变量.我该怎么做才能对原始对象的更改仅用于设置我的新变量?
这是我从来没有理解为什么会发生以及如何防止它的事情.有人可能会解释为什么会这样做以及如何预防它?
你是正确的,它改变了原来的,尽管这是设计使然。这是文档的链接
通过添加时间来改变原始时刻。
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)
我希望这是有道理的。一般来说,像这样的大型库,文档非常好,值得一读。
有人可能会解释为什么会这样做......
因为链式方法返回它们的上下文,如下所示:
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)