复制对象后删除对象属性时出现奇怪的行为
Strange behavior when deleting object property after copying object
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
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 解析JSON并从中删除对象会出错
- 如何从对象中删除属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 正在从对象中删除值
- 正在从列表中删除对象
- 删除对象时终止setInterval
- jQuery-检测选择对象是否添加或删除了选项
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 为什么没有从数组中存在的对象中删除属性
- 从Three.js场景中删除许多对象的速度较慢
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JS:将 EventListener 添加到动态创建的 DOM 对象中,这些对象删除 parentNode
- Java 脚本 json 解析对象:删除操作后不删除“,”
- JavaScript对象删除特定键值中的引号
- tinyMCE对象删除事件触发器
- javascript地图对象删除不工作
- Javascript对象删除元素