Javascript JS如何深度复制两个对象

Javascript JS如何深度复制两个对象,javascript,Javascript,我有一个问题: const obj1 = { val: {v: 0}} 我正试图通过以下方式进行深度复制: const obj2 = {...obj1} 但是{v:0}仍然没有被复制,我该怎么做>我想这是最简单的方法,但是有点笨拙 常量obj2=JSON.parse(JSON.stringify(obj1)) 否则,您需要编写一个递归克隆函数或使用一些库-只需沿着这些线搜索cloneDeep、copyDeep或smth。我没有足够的代表,甚至无法标记,但这是一个非常简单的问题重复 即使在谷

我有一个问题:

const obj1 = { val: {v: 0}}
我正试图通过以下方式进行深度复制:

const obj2 = {...obj1}

但是
{v:0}
仍然没有被复制,我该怎么做>

我想这是最简单的方法,但是有点笨拙

常量obj2=JSON.parse(JSON.stringify(obj1))
否则,您需要编写一个递归克隆函数或使用一些库-只需沿着这些线搜索cloneDeep、copyDeep或smth。

我没有足够的代表,甚至无法标记,但这是一个非常简单的问题重复

即使在谷歌上搜索标题也会更容易

无论如何,我使用了一个名为rfdc的模块来实现这一点,lodash有一个函数来实现这一点
否则,您可以使用递归函数在src对象中循环,该函数将字段添加到dest对象中

您可以为此使用
lodash es
包。它提供将递归克隆值的函数
cloneDeep()

这是包裹:

以下是文件:


您正在以您应该的方式(与spread operator)进行操作。spread操作员会很好地复制所有内容

constobj1={val:{v:0};
常量obj2={…obj1};

console.log(obj2)constobj2=JSON.parse(JSON.stringify(obj1))。你确定吗?对我有效。@Phix nope:
obj1.val.v=1
还更改了
obj2.val.v
的值这实际上只是执行
const obj2={…obj1}
的老方法(风险更大)。stringify
将以许多您不希望的方式修改对象(即函数丢失、数据类型转换等…@mwilson,
const obj2={…obj1}
不做深度复制,只做浅层(顶级道具)。是的,你在函数等方面是正确的,但在许多情况下,你只需要克隆POJO。引入整个库只是为了克隆一个对象?不,当使用
lodash es
时,只有你导入的内容才会包含在最终包中。如果你只导入
cloneDeep
,则最终包中只包含该库,而不是整个包。糟糕复制,因为
obj1.val.v=1
也会更改
obj2.val.v
的值是的,这是一个很好的提示。OP没有提到任何关于设置值的内容,但是,是的,在您提到的情况下,它将需要深度分解。否,OP提到深度复制
import { cloneDeep as _cloneDeep } from 'lodash-es';

const obj2  = _cloneDeep(obj1);