复制对象后删除对象属性时的奇怪行为

时间:2012-04-14 13:18:12

标签: javascript

  myObj = {
    prop1: 'alpha',
    prop2: 'beta',
    priceUpdatedOn: new Date()
  };

  myObjQuery = myObj;
  delete myObjQuery.priceUpdatedOn;

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

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

4 个答案:

答案 0 :(得分:4)

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

编辑: 在JavaScript中克隆对象并不简单。像jQuery或Ext这样的大多数库都有办法实现它。要手动完成,可以这样做。

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

请记住,这是一个浅层副本。要执行深层复制,您需要检测属性本身是否为对象,并以递归方式克隆它们。最好使用一个为您完成所有这些工作的库。并且还要记住,这是缺少许多边缘情况,以及对象的构造函数属性等奇怪的东西。 JavaScript在这里非常混乱。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

使用该命令

myObjQuery = myObj;

创建对象的副本,但只是对象的引用的副本。因此,之后myObjQuerymyObj仍然指向同一个对象。如果删除该对象的属性,则两个引用都将反映该更改。

答案 3 :(得分:1)

因为myObjQuery只是myObj的另一个名字。修改一个将反映另一个。

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