2012-05-26 98 views
0

我想通過各種j /腳本本地日期對象方法更新日期對象,但困惑爲什麼更改似乎應用於頁面上的所有日期對象。更新javascript日期對象

我最初找到一篇文章,建議在日期原型中添加一個方法,但是這改變了所有的日期選項。然後我簡化了,發現這兩個日期仍在更新。我將不勝感激任何有關如何防止這種情況的建議。我想要的是通過看起來有點像這樣的東西的starTime和endTime。 (注意:我最終會變成一個函數)。

time1 = new Date(); 
alert(time1);//returns Sat May 26 11:15:41 EDT 2012 
time2=time1; 
time2.setMinutes(time2.getMinutes()+10); 
alert(time1); //returns Sat May 26 11:25:41 EDT 2012 
alert(time2);//returns Sat May 26 11:25:41 EDT 20112 

問題:爲什麼是date2 = date1如果我只更新date2。

回答

5

當你這樣做:

time2=time1; 

...你不創建一個新Date對象,你只是指着從兩個獨立的變量日期對象。只有一個對象,因此無論您查看哪個變量,對其做出的任何更改都很明顯。

讓我們把一些ASCII藝術吧:

time1 = new Date(); 

這給了我們:

+-------+ 
+ time1 + 
+-------+     +---------------+ 
| value |---------------->| a Date object | 
+-------+     +---------------+

現在,當你這樣做:

time2=time1; 

我們有

+-------+ 
+ time1 | 
+-------+ 
| value |------+ 
+-------+  |   +---------------+ 
       +--------->| a Date object | 
       |   +---------------+ 
+-------+  | 
+ time2 |  | 
+-------+  | 
| value |------+ 
+-------+

time1time2變量參考Date對象,而不是它的一個副本。 (所有對象都以這種方式工作。)您可以將對象引用想象爲在內存中查找對象的位置的內存地址。 (什麼是實際上是依賴於實現。)

這是,其中變量的值實際上包含了原始的數據,例如不同的:在

var n = 42; 

結果

+-----------+ 
+  n  | 
+-----------+ 
| value: 42 | 
+-----------+

(在理論。事實上,字符串「原始人」將會表現得好像這是真的,但在現實中可能存儲更像對象。沒關係,字符串是不可變的,=====對於字符串原語比較了它們的內容,所以我們不能真正區分它們的差異,我們可以假裝它們實際上包含在變量中。 [只是爲了讓人困惑:JavaScript也有NumberString對象,其行爲與對象相似。])


重新低於你的問題:

在此期間,什麼是創建第二個JavaScript對象相同的預先存在的一個最有效的方法是什麼?

JavaScript對象沒有通用的「克隆」操作,因此答案因對象而異。有些對象不需要克隆,因爲它們是不可變的(無法更改),因此不需要克隆(例如,String對象)。

要克隆日期,很容易:

time2 = new Date(time1); 

還是更高效:

time2 = new Date(+time1); 

(因爲+告訴time1對象本身轉換爲數字,然後Date構造函數使用該編號。如果沒有它,將會要求time1對象將其轉換自我到一個字符串,然後構造函數將解析該字符串。仍然有效,但通過這個數字是一個微觀的,幾乎肯定是過早的優化  —和一個可能會干擾任何引擎可能想要使用的隱藏優化。所以,我只是去與time2 = new Date(time1);

+0

- 感謝您的回覆。我將不得不多做一些關於javascript操作的閱讀。在此期間,創建與預先存在的JavaScript對象相同的第二個JavaScript對象的最有效方法是什麼? –

+0

@Fooksie取決於對象的類型,但與日期,你可以做'time2 = new Date(+ time1);' – Esailija

+0

@Fooksie http://stackoverflow.com/a/10767467/139010 –

0

當你做到這一點。

time1 = new Date(); // <-- creates a new Date object 
time2 = time1;  // <-- time2 gets passed a reference to the time1 object 
        //  making them effectively the same 

您創建的第一行Date對象,而第二行則創建另一個Date對象,它僅指向或引用已創建的Date對象。這是許多面向對象編程語言的一個共同特徵。

1

發送此項目到目前爲止twoanswers是正確的。該解決方案是創建一個使用相同的內部毫秒值的第二日,從第一個複製:

var time1 = new Date(); 
var time2 = new Date(time1.getTime()); 

現在你有兩個不同的日期實例可以相互獨立地操作。

var time1 = new Date(); 
alert(time1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT) 
var time2 = new Date(time1.getTime()); 
time2.setMinutes(time2.getMinutes()+10); 
alert(time1); // Sat May 26 2012 11:26:16 GMT-0400 (EDT) 
alert(time2); // Sat May 26 2012 11:36:16 GMT-0400 (EDT) 

更多閱讀:Date – MDN

+0

這回答我的問題,謝謝你的幫助馬特。 –

+1

看來你可以通過直接將日期對象傳遞給日期構造函數來克隆日期對象 – Esailija