我正在为对象列表中的每个对象添加一个值。但我不知道为什么它为每个循环中的每个对象添加日期。
这是我的代码:
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或monthlist [x] .date)时,它会添加到每个循环中所有对象的所有日期值。
对于第一个循环,console.log看起来像这样:
[Object {date =“2013-1-01”},Object {date =“2013-1-01”},Object {date =“2013-1-01”},Object {date =“2013- 1-01“},对象{date =”2013-1-01“},对象{date =”2013-1-01“}等
在第一个循环中持续31次
在最后一个循环中它将是2013-1-31
我不明白为什么要将这个值添加到所有对象。我已经尝试过console.log并在所有地方进行调试以读取值并试图了解出了什么问题,但仍然没有找到解决方案
答案 0 :(得分:3)
数组中的引用都指向同一个对象。 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: ""
};
}