【问题标题】:Why javascript date.setDate() change the value of other date variables为什么javascript date.setDate() 改变其他日期变量的值
【发布时间】:2014-08-25 17:45:27
【问题描述】:

当我试图了解 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>   

我认为结果会是这样的:
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 值,我必须做什么?

提前致谢。

【问题讨论】:

    标签: javascript jquery html date variable-assignment


    【解决方案1】:

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

    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 个不同的对象 分配了三个内存。第 2 次和第 3 次分配包括创建新的 Date 对象,其中包含 date1 中对象的副本。


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

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

    【讨论】:

    • 实际上你不需要.getTime()
    • @Bergi 好吧,我不确定 new Date(date1) 是跨浏览器解决方案
    • 您能否解释一下在这种情况下内存分配的更多信息(两种分配有何不同)?
    • 我花了一些时间通过添加一些关于内存分配的解释来改进我的答案。希望你喜欢! :)
    • 哈。不需要解释,你的前 3 行回答了我的问题。谢谢!
    【解决方案2】:

    简单地说,Date 是一个对象,“Fri Jul 04 2014”只是它的内容。所以当你这样做时

    date3 = date1;
    

    你是说:

    让变量 date3 指向与变量 date1 相同的对象。但是仍然只有一个对象具有一种内容(例如,您的“Fri Jul 04 2014”)。无论您是通过 date1.toDateString()date3.toDateString() 无关紧要。因此,当您使用date3.setDate()date1.setDate(); 更改它时也没关系。

    您需要做的是构建另一个具有相同内容的对象:

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

    想象有一个房间只有一扇门 (d1),房间里有一只白猫。当你说d2 = d1 时,你只是用同一只白猫为同一个房间建造另一扇门。如果您拨打d2.changeCat(black),那么您将通过门d2 进入房间并将白猫换成黑猫。如果您稍后通过另一扇门(d1)进入房间,那么您当然会找到黑猫。这就是发生的事情。

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

    【讨论】:

    • 我还没有学很多javascript!
    【解决方案3】:

    您正在通过执行

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

    所以现在,例如,当使用 date2 时,您实际上引用了存储在 date1 变量中的日期对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多