2014-03-27 376 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更改对象。他们不创造一个新的。