2012-10-08 93 views
1

請有人能告訴我爲什麼這個操作會改變原始數組的值嗎?在JavaScript中複製數組變量?

var today = new Date(); 
var max_x_domain = [today]; 

var one_year_after_end = max_x_domain.slice(0)[0]; 
one_year_after_end.setYear(one_year_after_end.getFullYear() - 1); 

console.log('array after operation', max_x_domain); 

我怎樣才能使max_x_domain[1]副本...我需要用克隆方法as described here

這是......一個令人驚訝的JavaScript特性。

回答

1
var dateToCopy = new Date(); 

var newDate = new Date(dateToCopy); 

重構的代碼

var today = new Date(); 
var max_x_domain = [today]; 

var one_year_after_end = new Date(max_x_domain.slice(0)[0]); 
one_year_after_end.setYear(one_year_after_end.getFullYear() - 1); 

console.log('array after operation', max_x_domain); 
+0

'new Date(dateToCopy)'也可以。 – pimvdb

3

這不足爲奇,如果你認爲你的數組包含對象的引用。由於MDN docs狀態的這一部分:

對於對象引用(而不是實際的對象),slice拷貝對象引用到新的陣列。原始數組和新數組都指向同一個對象。如果引用的對象發生更改,則這些更改對新數組和原始數組均可見。

1

當您使用slice時,您將創建一個副本併爲此創建一個新數組,而不會修改原始數組。但是裏面的元素不會被複制/克隆,除非它們是原始類型(布爾,字符串,數字)。由於您在那裏有一個Date對象,所以會創建一個新的數組,但是對您的日期對象的相同引用將被「複製」。因此,如果您想擁有新的日期對象,請執行new Date(oldDate)/var one_year_after_end=new Date(max_x_domain.slice(0)[0]),然後您可以從此處對其進行修改,而無需修改原始日期對象。