Javascript 对复制的阵列进行更改,是否更新原始阵列?

Javascript 对复制的阵列进行更改,是否更新原始阵列?,javascript,Javascript,我有一个对象数组: let users = [{name: 'john', address: '10 king street'}, ....]; 我通过以下方式复制此阵列: let usersCopy = users.slice(0); 如果我这样做了 usersCopy[0].name = jeff; 它还更新了原始用户阵列上的此项: console.log(usersCopy[0].name) //jeff console.log(users[0].name) //jeff 我期待

我有一个对象数组:

 let users = [{name: 'john', address: '10 king street'}, ....];
我通过以下方式复制此阵列:

let usersCopy = users.slice(0);
如果我这样做了

usersCopy[0].name = jeff;
它还更新了原始用户阵列上的此项:

console.log(usersCopy[0].name) //jeff
console.log(users[0].name) //jeff
我期待看到:

console.log(usersCopy[0].name) //jeff
console.log(users[0].name) //john
这是因为[].slice执行浅层复制,这意味着您将获得一个新数组,但它不会克隆下面的对象。因此,用户[0]==UserScope[0],因为它们是对同一对象的相同引用

您需要完全替换UserScope[0]。例如:

usersCopy[0] = {...usersCopy[0], name: 'jeff'}
这将创建一个新对象,并将UserScope[0]浅层复制到其中。

这是因为[].slice进行浅层复制,这意味着您将获得一个新数组,但它不会克隆下面的对象。因此,用户[0]==UserScope[0],因为它们是对同一对象的相同引用

您需要完全替换UserScope[0]。例如:

usersCopy[0] = {...usersCopy[0], name: 'jeff'}
这将创建一个新对象,并将UserScope[0]中的所有内容复制到该对象中。

编辑:如下所述,此答案不正确

这里有一种替代方法,可以从原始阵列创建单独的阵列,以便修改克隆

const users=[{姓名:'John',地址:'10 king street'}]; const clone=新阵列用户; 克隆[0]。名称='Jeff'; console.logclone[0]。名称//jeff console.logusers[0]。name//johnEdit:如下所述,此答案不正确

这里有一种替代方法,可以从原始阵列创建单独的阵列,以便修改克隆

const users=[{姓名:'John',地址:'10 king street'}]; const clone=新阵列用户; 克隆[0]。名称='Jeff'; console.logclone[0]。名称//jeff
console.logusers[0]。name//john可能是的副本,但我正在更改副本而不是原始副本。正如副本中所述,这是一个浅副本。在你的数组中,你得到了另一个不会被克隆的json对象。副本涉及将同一个数组分配给不同的变量,这是一个不同的问题。可能是副本,但我更改的是副本而不是原始副本。正如副本中所说,这是一个浅副本。在你的数组中,你得到了另一个不会被克隆的json对象。复制的内容是将同一个数组分配给不同的变量,这是一个不同的问题。我怎么能不浅层复制数组中的对象呢?你可以使用lodash的uu.cloneDeep或其他深度克隆方法。但一般来说,您应该避免深度克隆任意对象,因为这在性能方面相当昂贵。我如何才能不在数组中浅层复制对象?您可以使用lodash的uu.cloneDeep或其他深度克隆方法。但一般来说,您应该避免对任意对象进行深度克隆,因为这在性能上相当昂贵。克隆现在是一个嵌套数组,如果您尝试记录克隆[0],则会有一个与Jeff相同的附加属性名。地址您将看到它未定义。克隆现在是一个嵌套数组,如果您尝试记录克隆[0]。地址,您将看到它是未定义的,并且具有与Jeff相同的附加属性名。