Javascript中的.slice()方法不按值复制

Javascript中的.slice()方法不按值复制,javascript,Javascript,好吧,我正在尝试为一个名为notakto的游戏制作一个AI。然而,这一点并不重要,为了实现我所做的搜索算法,我需要复制数组。所以我有一个名为board的全局数组,它看起来像这样[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],其中所有的0都是不同的数字。 要复制这个,我有下面一行var newboard=board.slice()。问题是,当我运行一行代码,如newboard[0][0]=1时,它会发生变化,就像我运行了下面的b

好吧,我正在尝试为一个名为notakto的游戏制作一个AI。然而,这一点并不重要,为了实现我所做的搜索算法,我需要复制数组。所以我有一个名为
board
的全局数组,它看起来像这样
[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]
,其中所有的0都是不同的数字。
要复制这个,我有下面一行<代码>var newboard=board.slice()。问题是,当我运行一行代码,如
newboard[0][0]=1
时,它会发生变化,就像我运行了下面的
board[0][0]=1
一样,这是因为嵌套数组是通过引用浅拷贝的。您可以使用类似这样的递归函数深度复制多维数组,如上面的多维数组,确保每个嵌套数组都是按值复制的:

函数copyMultidimensionalArray(数组){
var r=array.slice(0);
对于(变量i=0,l=r.length;i].加入(“”)复制数组,但不复制内部数组。这是一个有点黑客,但它的工作:

var newboard = JSON.parse(JSON.stringify(board));

在这种情况下,它会工作,但如果您的对象有任何函数,这些函数将通过stringify丢失。此外,它可能会给存储在对象内部的数据对象带来一些麻烦

javascript始终基于引用。如果要复制副本,请执行深层对象复制而不是浅层复制。 在angular中,
angular.copy()
将执行深度复制


var newboard=angular.copy(board.slice())

您也可以使用
board.map(函数(cv){return cv.slice();})
复制电路板:
var板=[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0];
var board2=board.map(函数(cv){return cv.slice();});
董事会2[0][0]=1;
控制台.日志(板);

控制台日志(board2)
您还必须为每个嵌套数组创建一个副本。
.slice()
为给定的数组创建一个副本,但它不能递归工作。如果您使用jQuery,您可以使用
$.extend
获得一个深度副本。始终存在旧的
var copy=JSON.parse(JSON.stringify(board))技巧
切片()。请参阅jQuery。这个问题没有角度标记。这只是理解概念的一个例子。您可能想解释这种方法的局限性,这样其他人就不会盲目复制它了。@FelixKling谢谢您的建议。我编辑这篇文章是为了提到我知道的一些限制。