起初我以为arr.slice(0)
正在做一个深未引用的副本,但它实际上只是做了一个浅未引用的副本,所以如果数组包含嵌套的数组,they are still referenced:
var a = [1,2]
var b = [3,4]
var c = [a,b]
var d = c.slice(0)
d[0] === a // true, which means it is the /same/ object
d[0][0] = "Hi!"
a // ["Hi!", 2]
<子> (example source) 子>
当你知道数组的结构时,所提供的链接上的解决方案相当容易(只需.slice(0)
再次嵌套数组就可以了。)但是如果你不知道如何嵌套数组的结构是。
我的第一个想法是在所有级别上循环整个事情,直到它找不到数组对象。
我简直无法相信我只需复制一个愚蠢的数组就可以做到这一切
答案 0 :(得分:6)
与nonnb建议一样,序列化/反序列化循环将导致深层复制。你可以这样做:
//a is some array with arbitrary levels of nesting.
var c = JSON.parse(JSON.stringify(a));