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

run*_*431 5 javascript

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

例如:

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

 var b = array.slice();
 console.log(b);
Run Code Online (Sandbox Code Playgroud)

我从Play by Play:Lea Verou的复数形式中看到了一个辅助实现:

 b =  array.slice().map( function(row){ return row.slice(); });
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 5

这些文档非常清楚:

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

因此答案是否定的:slice仅凭自身不足以克隆多维数组。它只会克隆一个维度。如果要进行深层克隆,则需要递归克隆每个元素(发布的“辅助实现”的方式)。


p.s*_*w.g 5

MDN

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] ]
Run Code Online (Sandbox Code Playgroud)

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