我正在尝试创建一个日期对象数组,从特定日期开始直到今天。
这是我的代码:
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循环中打印出数组中的日期时,我看到所有被推送的日期都是今天的日期。
有什么想法吗?
答案 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更改了对象。他们不会创建一个新的。