Javascript 如何在不指向同一对象的情况下复制变量?
可能重复:Javascript 如何在不指向同一对象的情况下复制变量?,javascript,object,Javascript,Object,可能重复: (大多数都使用外部库,或者不能完全工作。下面的博客文章是一个更好的资源) 这是scribd开发者挑战的背景。他们的API允许我调用get_board并获取board。但是,我想做的是在set_字段中修改该板的副本。但是,当我这样做时,它会弄乱他们自己的内部板对象,并破坏他们的代码。因此,我需要(我认为)调用get_board,然后断开指向对象的指针,并拥有我自己的板进行修改。我在下面用mygame.board尝试过这个,但仍然得到相同的错误 错误内容为:对象的类型与对象关联的参数的预
(大多数都使用外部库,或者不能完全工作。下面的博客文章是一个更好的资源) 这是scribd开发者挑战的背景。他们的API允许我调用get_board并获取board。但是,我想做的是在set_字段中修改该板的副本。但是,当我这样做时,它会弄乱他们自己的内部板对象,并破坏他们的代码。因此,我需要(我认为)调用get_board,然后断开指向对象的指针,并拥有我自己的板进行修改。我在下面用mygame.board尝试过这个,但仍然得到相同的错误 错误内容为:
对象的类型与对象关联的参数的预期类型不兼容
function new_game()
{
var board = get_board();
var mygame={board: board}
mygame.board = set_field(min_max_store, mygame.board)
}
function set_field(min_max_store, board)
{
//loop x
//loop y
board[x][y] = -1;
return board
}
如何阻止指针指向它们的对象,并让我自己的对象进行修改
编辑:
这将适用于二维阵列
var one = [[1,2],[2,3],[3,4],[4,5]]
var two = one.slice(0)
for(var x = 0; x <= one.length - 1; x++)
{
two[x] = one[x].slice(0)
}
one[1][1] = 10
console.log(one)
console.log(two)
复制对象时,它将始终创建指针。但对于基元类型,情况并非如此 您可以使用循环对象并递归获取其所有参数(深度)的方法。另一种方法是将对象编码为JSON,然后将其解码回新的变量中(虽然很草率,但也可以) 例如:
var foo = 5;
// This is not a pointer, since it is a primitive type
var bar = foo;
// 'foo' will stay at 5
bar = 537;
var object_one = {
var1: 3,
var2: 5,
};
// This is just a pointer.
var object_two = object_one;
// This will change 'var1' of 'object_one' as well as 'object_two'
object_two.var1 = 5;
使用JSON的示例:
var object_one = {
var1: 'bar',
var2: 5,
};
// A quick but dirty way to make a clone of the object without using a pointer
var object_two = JSON.parse(JSON.stringify(object_one));
使用递归的示例:
function clone_object(p_obj) {
var new_obj = new Object;
if (typeof(p_obj) == 'object') {
for (var i in p_obj) {
new_obj[i] = clone_object(p_obj[i]);
}
return new_obj;
} else {
return p_obj;
}
}
var object_one = {
var1: 'bar',
var2: 5,
};
var object_two = clone_object(object_one);
标题中不需要包含JavaScript一词。。这就是标签的用途…@Quentin我会进一步查看这些解决方案,但我无法访问任何其他工具或API,如prototype或jquery。我已经考虑过这一点。我只是想知道是否有更简单的方法。我明白我应该能够循环对象,提取值并将其推到新对象上,对吗?正确。var-foo=2;var-bar=foo;bar=377;警报(foo+“”+巴);我在博客文章中为2d数组创建了一个解决方案。我添加了一个小功能,如果你愿意,可以复制无限深的对象。我把它包括在解决方案中。
function clone_object(p_obj) {
var new_obj = new Object;
if (typeof(p_obj) == 'object') {
for (var i in p_obj) {
new_obj[i] = clone_object(p_obj[i]);
}
return new_obj;
} else {
return p_obj;
}
}
var object_one = {
var1: 'bar',
var2: 5,
};
var object_two = clone_object(object_one);