2014-03-27 209 views
0

我試圖創建一個從某個日期開始直到今天的日期對象數組。javascript for循環和數組推送

這裏是我的代碼:

var beginning = new Date("04,06,2013"); 

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

while (beginning < today){ 
    var x = beginning; 
    console.log(x); 
    dates.push(x); 
    beginning.setDate(beginning.getDate()+1) 
} 

for (var i in dates) { 
    console.log(dates[i]); 
} 

在while循環中我看到正確的日期遞增,但是當我在最後打印出數組中的日期環路我看到被推的所有日期作爲今天的日期。

任何想法?

回答

1

您的代碼所做的是將大量引用推送到完全相同的Date對象。所以,你有一個數組充滿了所有相同的Date對象,並且每次你改變這個對象時,數組中的所有元素都指向同一個對象,所以它們都會出現變化。

當你將一個對象插入一個數組或將一個對象賦給一個變量時,它不會創建一個副本,它將對它進行引用(將它看作是其他語言中的指針)。要爲循環的每次迭代推送不同的日期對象,您必須每次通過循環創建一個新的日期對象並推送它。

在javascript中,將對象或數組賦值給任何變量(包括將其推送到數組中)只分配對該對象或數組的引用,而不是副本。這是一個常見的問題,大多數人都想加快javascript的速度。

你可以做一個新的日期對象每次通過循環是這樣的:

var beginning = new Date("04,06,2013"); 

var dates = []; 
var today = new Date(), x; 

while (beginning < today){ 
    x = new Date(beginning.getTime()); 
    console.log(x); 
    dates.push(x); 
    beginning.setDate(beginning.getDate()+1) 
} 
0

您只能在所有代碼中使用單個Date實例。

創建日期的一個副本,這樣做:

x = new Date(beginning.getTime()); 

然後調用.setDate()方法來推動它。

JavaScript日期實例上的setter更改對象。他們不創造一個新的。