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

  myObjQuery = myObj;
  delete myObjQuery.priceUpdatedOn;

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

当我这样做时,由于某种原因,它们也会priceUpdatedOn被删除。myObj知道为什么吗?

4

4 回答 4

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 在这里真的很乱。

于 2012-04-14T13:20:39.637 回答
3

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

于 2012-04-14T13:21:28.310 回答
1

用那个命令

myObjQuery = myObj;

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

于 2012-04-14T13:22:07.230 回答
1

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

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

于 2012-04-14T13:22:34.733 回答