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

Strange behavior when deleting object property after copying object

本文关键字:对象 删除 属性 复制      更新时间:2023-09-26
  myObj = {
    prop1: 'alpha',
    prop2: 'beta',
    priceUpdatedOn: new Date()
  };
  myObjQuery = myObj;
  delete myObjQuery.priceUpdatedOn;
console.log(myObj);
console.log(myObjQuery);

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

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

编辑:在 JavaScript 中克隆对象并不简单。大多数像jQuery或Ext这样的库都有办法做到这一点。要手动执行此操作,这样的事情就可以了。

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

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

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

使用该命令

myObjQuery = myObj;

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

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

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