在类原型函数中复制javascript数组

在类原型函数中复制javascript数组,javascript,arrays,Javascript,Arrays,我有一个关于javascript的类: function Node(board,x,y,t){ this.board = board; this.x = x; this.y = y; this.playerTile = t; this.oponentTile = getOponentTile(this.playerTile); this.parent = null; this.getChildren = getChildren; };

我有一个关于javascript的类:

function Node(board,x,y,t){
    this.board = board;
    this.x = x;
    this.y = y;
    this.playerTile = t;
    this.oponentTile = getOponentTile(this.playerTile);
    this.parent = null;
    this.getChildren = getChildren;

};
我正在使用这个函数,它使用
slice()将
this.board
变量(一个数组)复制到
tempBoard
变量

var getChildren=function(){
if(this.x==-1&&this.y==-1){
var moves=getAllValidMoves(this.board,this.playertle);
}
否则{
var tempBoard=this.board.slice();
makeMove(tempBoard,this.playertle,this.x,this.y);
var moves=getAllValidMoves(临时板,this.playertle);
}
var children=[];
for(var i=0;i
.slice()
生成数组的浅拷贝,而不是深拷贝

这意味着,如果您有一个对象数组,并且使用
.slice()
创建该数组的副本,它将为您提供一个新数组,该数组是一级副本。但新数组指向与第一个数组相同的所有对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组

但是,如果修改数组中的对象,则两个数组中的对象是相同的,因此对数组中的任何对象进行修改(例如更改对象的属性)将在两个数组中看到

如果您想要数组及其内容的完整副本,那么您必须制作一个更复杂的深度副本,这稍微取决于数组中的确切内容

制作深度复制有许多不同的方法。您可以在以下参考资料中阅读其中的许多方法:

如果保证数组中没有任何循环引用(其中一个对象指向另一个对象,而另一个对象又指向该对象),则创建副本的最简单方法是:

var tempBoard = JSON.parse(JSON.stringify(this.board));
.slice()
生成数组的浅拷贝,而不是深拷贝

这意味着,如果您有一个对象数组,并且使用
.slice()
创建该数组的副本,它将为您提供一个新数组,该数组是一级副本。但新数组指向与第一个数组相同的所有对象。您可以重新排列复制的数组或从中删除元素,这不会影响第一个数组

但是,如果修改数组中的对象,则两个数组中的对象是相同的,因此对数组中的任何对象进行修改(例如更改对象的属性)将在两个数组中看到

如果您想要数组及其内容的完整副本,那么您必须制作一个更复杂的深度副本,这稍微取决于数组中的确切内容

制作深度复制有许多不同的方法。您可以在以下参考资料中阅读其中的许多方法:

如果保证数组中没有任何循环引用(其中一个对象指向另一个对象,而另一个对象又指向该对象),则创建副本的最简单方法是:

var tempBoard = JSON.parse(JSON.stringify(this.board));
也许有帮助

function copy(data){
    var result = JSON.stringify(data);
    return JSON.parse(result);
}
也许有帮助

function copy(data){
    var result = JSON.stringify(data);
    return JSON.parse(result);
}


所以你想要一个深度拷贝?
.slice()
只做一个浅拷贝。var tempBoard=[];this.board.slice().forEach(函数(b){tempBoard.push(b)};@JoseHermosillaRodrigo:这没什么不同。数组中的数据类型是什么
this.board
?那么你想要深度拷贝吗?
slice()
只做一个浅拷贝。var tempBoard=[];this.board.slice().forEach(函数(b){tempBoard.push(b)})@JoseHermosillaRodrigo:没什么不同。数组
这个.board
中是什么类型的数据?哦,这很有趣。那么,是的,我需要一个深度副本。我的数组只包含字符串。@PabloEstrada-你确定数组只包含字符串吗?因为字符串在Javascript中是不可变的,所以
.slice()
可以复制一份。你能告诉我们数组中实际有什么,以及为什么你认为两者都在改变吗?对不起,我错了。我有一个字符串数组。像这样
@PabloEstrada-那么你确实需要一个深度副本。我添加了几个关于制作深度副本的方法的参考和一个示例。感谢完整的答案:)stringify为我工作。哦,这很有趣。那么,是的,我需要一个深度副本。我的数组只包含字符串。@PabloEstrada-你确定数组只包含字符串吗?因为字符串在Javascript中是不可变的,所以
.slice()
可以复制一份。你能告诉我们数组中实际有什么,以及为什么你认为两者都在改变吗?对不起,我错了。我有一个字符串数组。像这样
@PabloEstrada-那么你确实需要一个深度副本。我添加了几个关于制作深度副本的方法的参考资料和一个示例。谢谢你完整的回答:)stringify对我有用。