为什么这个Javascript对象没有改变。。?

为什么这个Javascript对象没有改变。。?,javascript,javascript-objects,Javascript,Javascript Objects,复制对象并更改属性 属性似乎已更改,但对象未更改: var partCp = myDoorObj['part'][0]; for (var i = 0; i < doorCount; i++) { partCp['var']['no'] = i + 1; partCp['var']['_name'] = 'door' + (i + 1); console.log(partCp); console.log(partCp['var']['_name']);

复制对象并更改属性

属性似乎已更改,但对象未更改:

var partCp = myDoorObj['part'][0];
for (var i = 0; i < doorCount; i++) {

    partCp['var']['no'] = i + 1;
    partCp['var']['_name'] = 'door' + (i + 1);

    console.log(partCp);
    console.log(partCp['var']['_name']);

    myDoorObj['part'].push(partCp);

}
var partCp=myDoorObj['part'][0];
对于(变量i=0;i
使用控制台日志:

partCp['var']['u name']
已更改,但控制台中的
partCp
对象相同


那么问题出在哪里呢???

你推同一个物体两次。JavaScript数组通过引用存储对象;它们现在都指向同一个对象。但是,您也使用了一种方法,即写入
console.log
的对象在一段时间后才会显示,因此显示的值不是
console.log时对象的值,而是之后的某个时间点

但是,您的代码仍然有缺陷

partCp
在这里一直指同一个对象;首先将该对象的
编号
更改为
1
,将
名称
更改为
门1
,然后按;然后,将同一对象的
编号
更改为
2
,将
名称
更改为
door2
,并再次推送对该对象的引用;由于一开始只有一个对象,所以数组的两个元素都是对同一对象的引用。现在,浏览器错误让您发布了一个问题,但是在正常工作的浏览器上,如果您执行
console.log(myDoorObj['part'])
操作,您将看到阵列中仍然有
door2
s

要构建
partCp
的新副本,请参阅
我找到了解决这个问题的方法

var partCp = jQuery.extend(true, {}, myDoorObj['part'][0]);

for (var i = 0; i < doorCount; i++) {

    var tempPartCp = jQuery.extend(true, {}, partCp);

    tempPartCp['var']['no'] = i + 1;
    tempPartCp['var']['_name'] = 'door' + (i + 1);

    console.log(tempPartCp);
    console.log(tempPartCp['var']['_name']);

    myDoorObj['part'].push(tempPartCp);

}
var partCp=jQuery.extend(true,{},myDoorObj['part'][0]);
对于(变量i=0;i
但对象在更改之前会发送到控制台。问题在于Chrome如何将发送到控制台的消息排队,而不是对象属性。
=
仅复制引用。你的意思是做一份深度拷贝吗?要做到这一点,您可能需要一些递归,underline.js提供了一个合适的deepcopy。@chanjianyi如果您没有得到答案,那么只需感谢Juhana。Juhanas的要点是,存在一个已知的错误,您不能相信控制台可以按原样记录对象。尽管如此,OP说他只复制了引用,却复制了一个对象。