1

我正在为对象列表中的每个对象添加一个值。但我不知道为什么它为每个循环中的每个对象添加日期。

这是我的代码:

var emptyday: {
    "date":""
}

//make list of days in month
var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = emptyday;
}

因此,在我的示例中,可以说 days_in_months 是 31(天)

现在是添加

for (x=1;x<=days_in_months;x++) {

    console.log(x);
    if (x<10) {
        daynumber = "0" + x;
    } else {
        daynumber = x;
    }

    datestring = year + "-"+ (month+1) + "-" + daynumber;

    dayofmonth = monthlist[x]; 
    dayofmonth["date"] = datestring;
            //monthlist[x].date = datestring;

}

当我尝试添加 (dayofmonth["date"] = datestring or monthlist[x].date) 时,它会添加到每个循环中所有对象的所有日期值。

第一个循环的 console.log 看起来像这样:

[对象{日期=“2013-1-01”},对象{日期=“2013-1-01”},对象{日期=“2013-1-01”},对象{日期=“2013-1-01 "}、对象 { 日期 = "2013-1-01"}、对象 { 日期 = "2013-1-01"} 等

在第一个循环中进行了 31 次

在最后一个循环中,它将是 2013-1-31

我不明白为什么它会为所有对象添加该值。我已经尝试过 console.log 和到处调试以读出值并试图了解出了什么问题,但仍然没有找到解决方案

4

1 回答 1

4

数组中的引用都指向同一个对象。Javascript 是按值传递的。所以当你这样做时

//make list of days in month
var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = emptyday;
}

您将引用的副本放在emptyday数组中的每个位置。由于引用的副本都指向同一个对象字面量,因此您有一个对一个对象的引用数组。

您需要每次通过列表创建一个新的对象文字。

var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = {
       date: ""
    };
}
于 2013-01-04T13:39:42.280 回答