Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不指向同一对象的情况下复制变量?_Javascript_Object - Fatal编程技术网

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);