我将代码分解为简化的jsFiddle.问题是,该属性is只针对一个对象设置,但最终每个对象获得的最后一次迭代的值(在这种情况下,false但id05应该是true).为什么?我忽略了什么吗?
jsFiddle(在控制台中查看)
var reminder = {
id0: {
id: 0,
medId: 0
}
};
var chart = {
id0: {
medId: 0,
values: [[5,1]]
}
}
var tmp = {};
for(var i = 0; i < 10; i++) {
for (id in reminder) {
tmp[id + i] = reminder[id];
tmp[id + i].is = false;
for(var j = 0; j < chart["id" + reminder[id].medId].values.length; j++) {
if (chart["id" + reminder[id].medId].values[j][0] === i) {
tmp[id + i].is = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
tmp[id + i] = reminder[id]; 将复制对象的引用,而不是克隆对象本身.
考虑一下:
var a = { a: [] };
var b = a.a;
b.push(1);
console.log(a.a); // [1]
Run Code Online (Sandbox Code Playgroud)
这意味着所有对象都是相同的,并且它们共享相同的属性(tmp.id05 === tmp.id06等等...)
tmp.id00.__my_secret_value__ = 1234;
console.log(tmp.id09.__my_secret_value__); // 1234
Run Code Online (Sandbox Code Playgroud)
要在JavaScript中克隆对象,您可以使用Object.create但这只会产生浅克隆(仅克隆顶级属性)