为什么javascript date. setdate()会改变其他日期变量的值

Why javascript date.setDate() change the value of other date variables

本文关键字:日期 其他 变量 改变 date javascript setdate 为什么      更新时间:2023-09-26

当我试图知道setDate()的功能,setTime()的javscript日期我遇到了这个问题。

<script>
var date1 = new Date();
var date2 = new Date(1991,4,11);
var date3 = new Date(1992,4,11);
date3 = date1;
date2 = date1;
date2.setDate(date2 .getDate() + 40);//im changing only date2 value using setDate()  
//print values
</script>   

我想结果会是这样的:
2014年7月4日星期五
2014年8月13日星期三
2014年7月4日星期五

但是在输出中所有的日期变量都有相同的值:

2014年8月13日星期三

2014年8月13日星期三

2014年8月13日星期三

jsfiddle

如果我用整数变量做类似的代码,它们就像我想象的那样工作(所有的int变量都有不同的值)。

问题摘要

  1. 日期分配和号码分配有什么不同?
  2. 为什么以及如何javascript setDate()跟踪其他日期变量?
  3. 最后但并非最不重要的如果我想用这些赋值只改变date2值,我要做什么?

你需要把你的日期复印一份,像这样:

date3 = new Date(date1.getTime());
date2 = new Date(date1.getTime());

或简单的:

date3 = new Date(date1);
date2 = new Date(date1);
不是

date3 = date1;
date2 = date1;

否则,所有变量都指向同一个Date对象(最初由date1引用)。


EDIT(关于内存分配)

    —例1:
var date1 = new Date();           // Memory allocation for an object
var date2 = new Date(1991,4,11);  // Memory allocation n°2
var date3;                        // Obviously no memory allocation here
date3 = date1;                    // No memory allocation either, date2 and date3
date2 = date1;                    // become references of the object in date1

在这个例子中,有两个内存分配,但只有一个是有用的,因为date2中的对象没有被使用。

注意:最初在date2中的对象仍然存在,但不再被引用(它将被垃圾收集)。


    —例2:
var date1 = new Date();            // Memory allocation for an object
var date2 = new Date(date1);       // Memory allocation n°2
var date3 = new Date(date1);       // Memory allocation n°3
在本例中,3个不同的对象分配了3个内存。第二次和第三次分配包括创建新的Date对象,包含date1中对象的副本。
我希望这一点解释能让你更清楚。如果你对JavaScript中的内存管理感兴趣,我建议你看看这个: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

简单地说,Date是一个对象,"Fri Jul 04 2014"只是它的内容。所以当你输入

date3 = date1;
你说

:

让变量date3指向与变量date1相同的对象。但是仍然只有一个对象和一个内容(例如,你的"星期五,2014年7月4日")。你是否可以通过date1.toDateString()date3.toDateString()不重要。因此,当您使用date3.setDate()date1.setDate();更改它时,也无关紧要。

你需要做的是用相同的内容构建另一个对象:

date3 = new Date(date1.getTime());

想象有一个只有一扇门的房间(d1),房间里有一只白猫。当你说d2 = d1时,你只是用同样的白猫建造另一扇门。如果你呼叫d2.changeCat(black),那么你就从d2门进入房间,把白猫换成了黑猫。如果你稍后通过另一扇门(d1)进入房间,那么你当然只会找到黑猫。这就是结果。

你需要做的是用另一只白猫建造另一个房间,这样当你稍后把那只猫换成一只黑猫时,它不会影响到第一个房间里的白猫。

您通过执行

将对象引用分配给date1
date3 = date1;
date2 = date1;

现在,当使用date2的例子,你实际上引用日期对象存储在date1变量