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

Man*_*jSS 4 html javascript jquery date variable-assignment

当我试图了解setDate()的功能时,javscript日期的setTime()我遇到了这个问题.

<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>   
Run Code Online (Sandbox Code Playgroud)

我认为结果将是:
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值,我该怎么办?

提前致谢.

Tip*_*-Sy 14

您需要复制日期,如下所示:

date3 = new Date(date1.getTime());
date2 = new Date(date1.getTime());
Run Code Online (Sandbox Code Playgroud)

或者干脆:

date3 = new Date(date1);
date2 = new Date(date1);
Run Code Online (Sandbox Code Playgroud)

代替

date3 = date1;
date2 = date1;
Run Code Online (Sandbox Code Playgroud)

否则,您的变量都指向相同的Date对象(最初引用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
Run Code Online (Sandbox Code Playgroud)

在此示例中,有两个内存分配,但只有一个是有用的,因为未使用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
Run Code Online (Sandbox Code Playgroud)

在此示例中,有3个不同对象的三个内存分配.第二和第三个分配包括创建新的Date对象,其中包含date1中对象的副本.


我希望这个小解释更清楚.如果您对JavaScript中的内存管理感兴趣,我建议您看一下:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

  • +1 ..请继续解释原因. (2认同)