为什么javascript date.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()

当我试图了解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日星期三

如果我用整型变量编写类似的代码,它们的工作方式就像我想的那样(所有整型变量都有不同的值)

问题摘要

  • 日期分配和编号分配有何不同
  • 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;
    
    否则,所有变量都指向相同的日期对象(最初由
    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)这是一个跨浏览器的解决方案。在这种情况下,你能解释一下关于内存分配的更多信息吗(两种分配有什么不同)?我花了一些时间通过添加一些关于内存分配的解释来改进我的答案。希望你喜欢!:)哈不需要解释,你的前三行回答了我的问题。谢谢