2

起初我以为arr.slice(0)是在做一个深度未引用的副本,但它实际上只是在做一个浅层的未引用副本,所以如果数组包含嵌套数组,它们仍然被引用

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]

(示例来源)

当您知道数组的结构时,提供的链接上的解决方案相当容易(只需.slice(0)再次嵌套数组即可解决问题),但如果您不知道嵌套数组的结构如何,它会变得复杂。

我的第一个想法是在所有层面上循环整个事情,直到找不到大批目的。

  • 这种方法可以接受吗?
  • 是否有一些我缺少的内置功能?

我简直不敢相信我需要为复制一个愚蠢的数组做所有这些

4

1 回答 1

6

就像 nonnb 建议的那样,序列化/反序列化周期将导致深层复制。你可以这样做:

//a is some array with arbitrary levels of nesting.
var c = JSON.parse(JSON.stringify(a));
于 2012-06-05T05:05:55.937 回答