2014-07-04 47 views
2

當我試圖瞭解setDate(),setTime()的javscript日期功能時,我遇到了這個問題。爲什麼javascript date.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> 

我想結果會是怎樣:
星期五2014年7月4日
星期三2014年8月13日
週五2014年7月4日

但在輸出的所有日期變量具有相同的價值:

Wed Aug 13 2014

Wed Aug 13 2014

星期三2014年8月13日

jsfiddle

如果我做類似的那種與他們一樣,因爲我覺得工作整型變量代碼(所有詮釋變量具有不同的值)。問題

  1. 日期佈局和數字佈局有何不同的

    摘要?

  2. 爲什麼和如何javascript setDate()跟蹤其他日期變量?
  3. 最後但並非最不重要如果我只想改變這些賦值的date2值,我該怎麼辦?

在此先感謝。

回答

10

你需要讓你的日期的副本,是這樣的:

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個不同的物體三個存儲器分配。第二和第三個分配包括創建新的Date對象,其中包含date1中對象的副本。


我希望這個小解釋更清楚。如果您有興趣在JavaScript中的內存管理,我建議你看看這個:

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

+2

+1 ..請繼續解釋原因。 – PeterKA

+0

實際上你不需要'.getTime()'。 – Bergi

+0

@Bergi好吧,我不確定新的日期(date1)是一個跨瀏覽器的解決方案 –

0

你被做

date3 = date1; 
date2 = date1; 

所以,現在分配的對象引用DATE1,當使用date2作爲實例時,你實際上引用了存儲在date1變量中的日期對象。

0

簡而言之,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)進入房間,那麼當然您只會找到黑貓。那就是發生了什麼。

你需要做的是用另一隻白色的貓建造另一個房間,所以當你稍後更換一隻黑貓時,它不會影響第一個房間裏的白貓。

相關問題