javascript - 使用 Object.assign() 删除克隆对象的嵌套属性会影响原始对象

标签 javascript ecmascript-6

有人可以向我解释一下这种行为吗?

const object1 = {
  a: {
    d : 1,
    e : 4
  },
  b: 2,
  c: 3
};

const object2 = Object.assign({}, object1);
console.log('object1 :', object1);
console.log('object2 :', object2);
delete object2.a;
console.log('object1 :', object1);
console.log('object2 :', object2);

如果我删除a,则只有object2受到影响。

> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { b: 2, c: 3 }

如果我删除嵌套属性...

const object2 = Object.assign({}, object1);
console.log('object1 :', object1);
console.log('object2 :', object2);
delete object2.a.d;
console.log('object1 :', object1);
console.log('object2 :', object2);

object1object2 都丢失了属性 d

> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object1 :" Object { a: Object { e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { e: 4 }, b: 2, c: 3 }

为什么?

最佳答案

分配文档中的示例部分 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign ):

Warning for Deep Clone

For deep cloning, we need to use other alternatives because Object.assign() copies property values. If the source value is a reference to an object, it only copies that reference value.

有一个关于如何深度克隆对象的具体示例:

JSON.parse(JSON.stringify(obj1))

如果您想了解更多信息,有一个关于此问题的旧线程:

What is the most efficient way to deep clone an object in JavaScript?

关于javascript - 使用 Object.assign() 删除克隆对象的嵌套属性会影响原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359169/

相关文章:

javascript - 如何删除字符串中最后一个逗号字符后的所有内容?

javascript - AWS graphQL 错误 : "Variable ' input' has coerced Null value for NonNull type 'ID!' "

javascript - 如何在 aria true 或 false 时将 addClass 和 removeClass 添加到子元素?

javascript - 如何扩展 Sequelize 模型?

javascript - 禁止文件夹 1 从文件夹 2 导入任何内容

javascript - 通过变量赋值或调用函数访问属性?

javascript - 渲染后应用 jQuery 插件的 Meteor 模板

javascript - 如何在 Javascript 中推送代理对象中的数组值

typescript - 如何避免在 Angular 2 中导入相对路径很长的内容?

javascript - 如何使用 .map 重新格式化将 php 数组转换为 js 数组