为什么javascript date. setdate()会改变其他日期变量的值
Why javascript date.setDate() change the value of other date variables
当我试图知道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变量都有不同的值)。
问题摘要
- 日期分配和号码分配有什么不同? 为什么以及如何javascript setDate()跟踪其他日期变量?
- 最后但并非最不重要的如果我想用这些赋值只改变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)进入房间,那么你当然只会找到黑猫。这就是结果。
你需要做的是用另一只白猫建造另一个房间,这样当你稍后把那只猫换成一只黑猫时,它不会影响到第一个房间里的白猫。
您通过执行
将对象引用分配给date1date3 = date1;
date2 = date1;
现在,当使用date2的例子,你实际上引用日期对象存储在date1变量
- 如何在Javascript中验证日期期间与其他日期期间的交叉
- 如何根据其他日期的输入更新日期
- 确定Twig(或JavaScript)中的国际日期格式,以便在其他地方使用
- 在jsp中,隐藏一个基于其他具有日期选择器的字段的字段
- 如何将日期选择器返回的日期格式转换为其他格式
- 从日期选择器中获取默认格式的日期,并在jquery UI中转换为其他格式
- 如何使用可点击按钮在Datepicker日历中选择用户在其他月份的当前日期
- 如何在 UI-日期选择器中选择日期 在其他 UI 日期选择器上
- 日期选取器问题,尝试提交除日期值之外的其他参数
- 日期格式在 Chrome 中给出的结果与其他浏览器中的结果不同
- 为什么本地化仅在单击日期或任何其他按钮后才会更改
- 将 Javascript 日期解析为 C# DateTime,FF 数据是 Chrome 日期以外的其他数据
- 在特定日期将基本图像替换为其他图像.可能
- 如何在 jquery ui 日期选取器中调整其他输入的大小
- 更改其他日期类型字段时,如何修改日期类型字段
- 当请求php脚本生成的图像时,如何使用javascript/其他方法以某种格式打印日期
- 如何将Jquery日期选择器添加到其他脚本中
- 根据日期和其他字段聚合Mongo集合中的数据,并进行计数
- 如何根据其他日期约束jQuery ui日期选择器的最小和最大日期
- 主干日期+其他参数排序