當你這樣做:
time2=time1;
...你不創建一個新Date
對象,你只是指着從兩個獨立的變量日期對象。只有一個對象,因此無論您查看哪個變量,對其做出的任何更改都很明顯。
讓我們把一些ASCII藝術吧:
time1 = new Date();
這給了我們:
+-------+
+ time1 +
+-------+ +---------------+
| value |---------------->| a Date object |
+-------+ +---------------+
現在,當你這樣做:
time2=time1;
我們有
+-------+
+ time1 |
+-------+
| value |------+
+-------+ | +---------------+
+--------->| a Date object |
| +---------------+
+-------+ |
+ time2 | |
+-------+ |
| value |------+
+-------+
的值time1
和time2
變量是參考到Date
對象,而不是它的一個副本。 (所有對象都以這種方式工作。)您可以將對象引用想象爲在內存中查找對象的位置的內存地址。 (什麼是實際上是依賴於實現。)
這是元,其中變量的值實際上包含了原始的數據,例如不同的:在
var n = 42;
結果
+-----------+
+ n |
+-----------+
| value: 42 |
+-----------+
(在理論。事實上,字符串「原始人」將會表現得好像這是真的,但在現實中可能存儲更像對象。沒關係,字符串是不可變的,==
和===
對於字符串原語比較了它們的內容,所以我們不能真正區分它們的差異,我們可以假裝它們實際上包含在變量中。 [只是爲了讓人困惑:JavaScript也有Number
和String
對象,其行爲與對象相似。])
重新低於你的問題:
在此期間,什麼是創建第二個JavaScript對象相同的預先存在的一個最有效的方法是什麼?
JavaScript對象沒有通用的「克隆」操作,因此答案因對象而異。有些對象不需要克隆,因爲它們是不可變的(無法更改),因此不需要克隆(例如,String
對象)。
要克隆日期,很容易:
time2 = new Date(time1);
還是略更高效:
time2 = new Date(+time1);
(因爲+
告訴time1
對象本身轉換爲數字,然後Date
構造函數使用該編號。如果沒有它,將會要求time1
對象將其轉換自我到一個字符串,然後構造函數將解析該字符串。仍然有效,但通過這個數字是一個微觀的,幾乎肯定是過早的優化 —和一個可能會干擾任何引擎可能想要使用的隱藏優化。所以,我只是去與time2 = new Date(time1);
)
- 感謝您的回覆。我將不得不多做一些關於javascript操作的閱讀。在此期間,創建與預先存在的JavaScript對象相同的第二個JavaScript對象的最有效方法是什麼? –
@Fooksie取決於對象的類型,但與日期,你可以做'time2 = new Date(+ time1);' – Esailija
@Fooksie http://stackoverflow.com/a/10767467/139010 –