myObj = {
prop1: 'alpha',
prop2: 'beta',
priceUpdatedOn: new Date()
};
myObjQuery = myObj;
delete myObjQuery.priceUpdatedOn;
console.log(myObj);
console.log(myObjQuery);
当我这样做时,由于某种原因,它们也会priceUpdatedOn
被删除。myObj
知道为什么吗?
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;
您不会创建对象的副本,而只是创建对象引用的副本。所以之后两者myObjQuery
仍然myObj
指向同一个对象。如果您删除该对象的属性,则两个引用都将反映该更改。
因为 myObjQuery 只是 myObj 的另一个名称。修改一个将反映另一个。
参考:http ://docstore.mik.ua/orelly/webprog/jscript/ch11_02.htm