javascript for循环和数组推送

时间:2014-03-27 21:41:40

标签: javascript arrays

我正在尝试创建一个日期对象数组,从特定日期开始直到今天。

这是我的代码:

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循环中,我看到正确的日期递增但是当我在最后一个for循环中打印出数组中的日期时,我看到所有被推送的日期都是今天的日期。

有什么想法吗?

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

您只在整个代码中使用一个Date实例。

要创建日期的副本,请执行以下操作:

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

然后调用.setDate()方法将其向前移动。

JavaScript Date实例上的setter更改了对象。他们不会创建一个新的。