【问题标题】:Strange behavior when deleting object property after copying object复制对象后删除对象属性时的奇怪行为
【发布时间】:2012-04-14 13:18:11
【问题描述】:
  myObj = {
    prop1: 'alpha',
    prop2: 'beta',
    priceUpdatedOn: new Date()
  };

  myObjQuery = myObj;
  delete myObjQuery.priceUpdatedOn;

console.log(myObj);
console.log(myObjQuery);

当我这样做时,priceUpdatedOn 也会出于某种原因从 myObj 中删除。知道为什么吗?

【问题讨论】:

标签: javascript


【解决方案1】:

这是因为 myObjQuery 和 myObj 是同一个对象。当您执行myObjQuery = myObj 时,您不会复制对象本身,而是复制对它的引用。你永远不会直接在 JavaScript 中操作对象,而是总是通过引用。

编辑: 在 JavaScript 中克隆对象并不简单。大多数库,如 jQuery 或 Ext 都有办法做到这一点。要手动完成,类似这样的工作。

var clone = {};
for(var prop in myObj) {
   if(myObj.hasOwnProperty(prop)) {
       clone[prop] = myObj[prop];
   }
}

请记住,这是一个浅拷贝。要进行深度复制,您需要检测属性本身是否是对象并递归地克隆它们。最好使用为您完成所有这些工作的库。还要记住,这会丢失很多边缘情况,以及对象的构造函数属性等奇怪的东西。 JavaScript 在这里真的很乱。

【讨论】:

  • 那么我该如何复制对象呢?
  • @Shamoon -- 我编辑了答案并添加了如何在 JS 中复制对象
  • @jimw——引用一个不能回答这个问题的问题是没有意义的。那里接受的答案不会告诉 OP 关于复制或克隆对象的太多信息。
  • @Shamoon: 与其复制,不如使用Object.create将原版设置为新的prototype(根据你的实际情况而定).
  • @amnotiam - 你有问题 - OP 的“复制对象”实际上是什么意思?
【解决方案2】:

Javascript 与引用一起工作。 myObjQuery 和 myObj 是对内存中相同数据的引用。改变一个的属性将改变内存中的副本,因此 - 所有对它的引用。您必须改为clone the object

【讨论】:

    【解决方案3】:

    使用该命令

    myObjQuery = myObj;
    

    您不是创建对象的副本,而只是创建对象引用的副本。所以之后myObjQuery 和myObj 仍然指向同一个对象。如果您删除该对象的属性,则两个引用都将反映该更改。

    【讨论】:

      【解决方案4】:

      因为 myObjQuery 只是 myObj 的另一个名称。修改一个会影响另一个。

      参考:http://docstore.mik.ua/orelly/webprog/jscript/ch11_02.htm

      【讨论】:

        猜你喜欢
        • 2017-11-20
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多