javascript - 复制对象后删除对象属性时的奇怪行为

标签 javascript

  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 - 复制对象后删除对象属性时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10153945/

相关文章:

javascript - 如何将下一个同级移动到CSS Grid中的下一行?

javascript - 确定变量是增加还是减少?

javascript - 如何生成 xml 文件并允许用户使用 javascript 将其保存在本地?

javascript - 从 javascript 对象的属性中获取键名

javascript - 硬币 slider : $ is not defined

javascript - 如何将 body 元素添加到空 DOM 文档?

javascript - 黑莓网络 : window size (Window height) returning incorrect value in blackberry simulator

javascript - Angular - 根据条件导航到路线或调用 Controller 功能

javascript - Firestore 获取已查询文档的路径

javascript - 将视频 Blob URL 转换为视频 mp4 文件