为什么javascript date.setDate()更改其他日期变量的值
当我试图了解setDate()的功能时,我遇到了这个问题为什么javascript date.setDate()更改其他日期变量的值,javascript,jquery,html,date,variable-assignment,Javascript,Jquery,Html,Date,Variable Assignment,当我试图了解setDate()的功能时,我遇到了这个问题 <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()
<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>
var date1=新日期();
var date2=新日期(1991,4,11);
var date3=新日期(1992年4月11日);
date3=date1;
日期2=日期1;
date2.setDate(date2.getDate()+40)//使用setDate()仅更改date2值
//打印值
我想结果会是这样:2014年7月4日星期五
2014年8月13日星期三
2014年7月4日星期五 但在输出中,所有日期变量都具有相同的值: 2014年8月13日星期三 2014年8月13日星期三 2014年8月13日星期三 如果我用整型变量编写类似的代码,它们的工作方式就像我想的那样(所有整型变量都有不同的值) 问题摘要
提前感谢。您需要复制您的日期,如下所示:
date3 = new Date(date1.getTime());
date2 = new Date(date1.getTime());
或者简单地说:
date3 = new Date(date1);
date2 = new Date(date1);
而不是
date3 = date1;
date2 = date1;
否则,所有变量都指向相同的日期对象(最初由date1
引用)
编辑(关于内存分配)
- -示例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个不同的对象。第二次和第三次分配包括创建新的日期对象,其中包含date1中对象的副本
我希望这个小小的解释能更清楚。如果您对JavaScript中的内存管理感兴趣,我建议您看看:
通过执行
date3 = date1;
date2 = date1;
所以现在,当使用date2时,实际上引用了date1变量中存储的date对象。简单地说,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)进入房间,那么你当然会找到那只黑猫。事情就是这样
你需要做的是用另一只白猫来建造另一个房间,这样当你以后把那只猫换成一只黑猫时,它不会影响第一个房间里的白猫。实际上你不需要.getTime()
。@Bergi好的,我不确定新的日期(date1)这是一个跨浏览器的解决方案。在这种情况下,你能解释一下关于内存分配的更多信息吗(两种分配有什么不同)?我花了一些时间通过添加一些关于内存分配的解释来改进我的答案。希望你喜欢!:)哈不需要解释,你的前三行回答了我的问题。谢谢