所有数组元素都具有相同的值

时间:2015-10-14 21:05:20

标签: javascript arrays

以下是我的JavaScript代码:

var enddate, finaldate, startyear, endyear, i;
startyear = 2010;
endyear = 2011;
enddate = new Date(endyear, 11, 31)
finaldate = new Date(enddate)
var a = [];
j = 0;
enddate.setDate(enddate.getDate() + 6)
for (i = new Date(startyear, 0, 1); i <= enddate; i.setDate(i.getDate() + 6)) {
    if (i > finaldate) {
        console.log(finaldate);
    } else {
        console.log("Value of i: " + i);
        a.push(i);

        console.log(a[j++]);
    }
}

for (var k = 0; k <= a.length; k++) {
    console.log(a[k])
}

语句console.log("Value of i: " +i);在控制台中打印正确的值但是当我尝试在末尾打印数组a的值时,它会将所有值都显示为 2012年1月9日星期一00 :00:00 GMT-0500(EST),无法理解为什么会发生这种情况。

2 个答案:

答案 0 :(得分:1)

您需要在循环内创建一个新的日期对象。在javascript中对数组使用.push()时,对象和数组将通过引用推送。像数字这样的内置类型被作为副本推送。

var enddate, finaldate, startyear, endyear, i;
startyear = 2010;
endyear = 2011;
enddate = new Date(endyear, 11, 31)
finaldate = new Date(enddate)
var a = [];
j = 0;
enddate.setDate(enddate.getDate() + 6)
for (i = new Date(startyear, 0, 1); i <= enddate; i.setDate(i.getDate() + 6)) {
    if (i > finaldate) {
        console.log(finaldate);
    } else {
        console.log("Value of i: " + i);
        var m = new Date(i);
        a.push(m);

        console.log(a[j++]);
    }

}


for (var k = 0; k <= a.length; k++) {

    console.log(a[k])
}

答案 1 :(得分:1)

您可以在循环开始时创建一个日期对象,并在i中存储对它的引用。

每次循环时,都会将该引用复制到数组中并修改日期对象的值。

最终会得到一个数组,其中包含对同一日期对象的一系列引用,这些对象设置为您设置的最终值。

每次循环时都需要创建一个新的日期对象。

e.g。

a.push(new Date(i));