1

我正在制作一个在数组上运行算法的应用程序。因为在算法执行过程中数组的内容会发生变化,所以我事先将数组内容存储到另一个数组中——在源数组上执行“if”语句,但更新临时数组,然后将它们等同起来。

问题是运行算法后,两个数组仍然是相同的。似乎更新临时数组会自动更新源数组。

我创建了这个 jsfiddle来演示:

var a = new Array( 0 , 1 , 2 );
var b = a;

b[1]=3;

document.write( (a[1]==b[1]) );

//Should show 'false' as this will not be correct

上面的代码返回“True”。这是正常行为吗?我该如何克服呢?

4

3 回答 3

3

b = a不复制数组,而是一个引用。用于b = a.slice()制作副本。

也可以看看 ...

于 2012-11-23T12:27:40.783 回答
3

这是正常行为,当复制数组时,您实际上是在进行引用,所以当您这样做时var b = a,这意味着您不是复制值,而是复制引用

如果你想浅拷贝一个数组(只有一个深度级别的数组),那么你可以使用这样的简单方法:

var b = a.slice(0);

但是,如果您想深度复制一个数组(具有 2 个或更多深度级别的数组),那么您可以使用以下方法:

var objClone = function(srcObj) {
  var destObj = (this instanceof Array) ? [] : {};
  for (var i in srcObj)
  {
     if (srcObj[i] && typeof srcObj[i] == "object") {
         destObj[i] = objClone(srcObj[i]);
     } else {
         destObj[i] = srcObj[i];
     }
  }

  return destObj;
};

要使用这两种方法,请检查此 jsFiddle

于 2012-11-23T12:28:16.597 回答
1

正如其他人提到a = b的那样,不会复制数组。但是,如果您最终使用该.slice()方法复制数组,请注意数组中的对象将通过引用进行复制。

举个例子

var obj = { greeting: "hello world" };

var a = [ obj ];
var b = a;

a[0].greeting = "foo bar";
b[0].greeting // => "foo bar";

除此之外,你很高兴:)

于 2012-11-23T12:36:13.103 回答