myObj = {
prop1: 'alpha',
prop2: 'beta',
priceUpdatedOn: new Date()
};
myObjQuery = myObj;
delete myObjQuery.priceUpdatedOn;
console.log(myObj);
console.log(myObjQuery);
当我这样做时,priceUpdatedOn
也会因某种原因从myObj
中删除。知道为什么吗?
答案 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;
你不创建对象的副本,但只是对象的引用的副本。因此,之后myObjQuery
和myObj
仍然指向同一个对象。如果删除该对象的属性,则两个引用都将反映该更改。
答案 3 :(得分:1)
因为myObjQuery只是myObj的另一个名字。修改一个将反映另一个。
请参阅:http://docstore.mik.ua/orelly/webprog/jscript/ch11_02.htm