我正在制作一个在数组上运行算法的应用程序。因为在执行算法期间数组的内容会发生变化,所以我事先将数组内容存储到另一个数组 - 在源数组上执行'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”。这是正常的行为吗?我怎么能克服这个?
答案 0 :(得分:3)
b = a
不会复制数组,而是复制引用。使用b = a.slice()
制作副本。
答案 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";
除此之外你很高兴:)