更改后,Javascript数组保持相同

时间:2012-11-23 12:24:58

标签: javascript arrays

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

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

我已创建this 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”。这是正常的行为吗?我怎么能克服这个?

3 个答案:

答案 0 :(得分:3)

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

See also ...

答案 1 :(得分: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;
};

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

答案 2 :(得分: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";

除此之外你很高兴:)