嵌套for循环覆盖对象属性

Fab*_*bic 1 javascript

我将代码分解为简化的jsFiddle.问题是,该属性is只针对一个对象设置,但最终每个对象获得的最后一次迭代的值(在这种情况下,falseid05应该是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)

and*_*lrc 6

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但这只会产生浅克隆(仅克隆顶级属性)