array.slice是否足以处理JavaScript中的多维数组?

array.slice是否足以处理JavaScript中的多维数组?,javascript,Javascript,array.slice是否足以在JavaScript中克隆多维数组 例如: var array = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; var b = array.slice(); console.log(b); 我从Play-by-Play中看到了一个二级实现:pluralsight上的Lea Verou: b = array.slice(

array.slice
是否足以在JavaScript中克隆多维数组

例如:

 var array = [
                [1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]
    ];

 var b = array.slice();
 console.log(b);
我从Play-by-Play中看到了一个二级实现:pluralsight上的Lea Verou:

 b =  array.slice().map( function(row){ return row.slice(); });
问题很清楚:

slice()
方法将数组部分的浅拷贝返回到新的数组对象中

因此答案是否定的:
slice
本身不足以克隆多维数组。它将只克隆一个维度。如果需要深度克隆,则需要递归地克隆每个元素(与您发布的“次要实现”的方式相同)。

来自:

slice()
方法返回数组部分到新数组对象中的浅副本

也就是说,它不会克隆内部阵列/对象。注意:

 var array = [
                [1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]
    ];

 var b = array.slice();
 b[0].push(10); 
 console.log(array);
 > [ [1, 2, 3, 10], [4, 5, 6], [7, 8, 9] ]

因此,如果您想要2D数组的深度副本,则必须使用map方法(或类似方法)。

您到底想做什么?克隆数组数组。您总是只有数字吗?如果是这样的话,有一种简单的作弊方法……忘记技巧,只需使用array.map(函数(a){returna.slice(0);});或者缓慢但可靠的JSON.parse(JSON.stringify(array));我发现JSON方法比我的9x9数组(空/整数)的map方法更快。我知道这不算什么,但对Suduko来说太完美了。谢谢当我在两个实现上执行console.log(b)时,它似乎返回相同的输出。这就是我感到困惑的原因。@runners3431-使用控制台日志来测试一个对象是否是另一个对象的克隆是可疑的;毕竟,如果它们是克隆体,它们应该产生相同的输出。更好的做法是记录身份测试的结果(例如,
console.log(数组[0]==b[0]);
)。顺便提一下,在“辅助实现”中,
b=array.slice().map(…)
可以替换为
b=array.map(…)
map()
函数无论如何都会返回一个新数组,因此制作
array
的浅层副本并不划算。如果是浅层克隆副本,那不包括数组的某些部分吗?@runners3431-抱歉,我不明白你最后的评论。你能重新措辞和/或详细说明吗?浅层克隆副本将包含与原始数组相同的所有元素(相同——不是克隆/副本),只是在一个新的数组对象中。