【问题标题】:Why this Javascript Object not change..? [duplicate]为什么这个 Javascript 对象不改变..? [复制]
【发布时间】:2014-05-29 07:49:52
【问题描述】:

我复制对象并更改属性,

好像属性变了,但是对象没有变:

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);

}

使用控制台日志:

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

那是什么问题??

【问题讨论】:

  • = 仅复制参考。你的意思是做一个深拷贝吗?你可能需要一些递归来做到这一点,underscore.js 提供了一个合适的 deepcopy。
  • @chanjianyi 如果您没有得到答案,请感谢 Juhana。
  • Juhanas 的观点是存在一个已知错误,您不能相信控制台会按原样记录对象。此外,虽然,OP 说他只复制了引用时复制了一个对象。

标签: javascript javascript-objects


【解决方案1】:

我找到了解决问题的方法...

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);

}

【讨论】:

    【解决方案2】:

    您正在推动同一个对象两次。 JavaScript 数组通过引用存储对象;它们现在都指向同一个对象。但是,您还使用了browser that suffers from a bug,写入console.log 的对象要过一段时间才会显示,因此显示的值不是console.log 时对象的值,而是某个时间点之后的时间。

    但是,您的代码仍然有问题。

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

    要构造partCp 的新副本,请参阅 Javascript - How to clone an object?

    【讨论】:

    • 但是对象被发送到控制台之前它被改变了。问题在于 Chrome 如何对发送到控制台的消息进行排队,而不是对象属性。
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多