function myFunction()
{
var Arr2
if(Arr1!=null)
{
Arr2=Arr1
console.log("Arr2 before for: "+Arr2)
console.log("Arr1 before for: "+Arr1)
}
for(var index=-1+Arr2.length;index>=0;index--)
{
if(Arr2[index]=="to_delete")
{
Arr2.splice(index,1)
}
}
console.log("Arr1 after for: "+Arr1)
console.log("Arr2 after for: "+Arr2)
}
我在一个函数中创建了Arr2,Arr2 = Arr1,问题是Arr1在for期间也被拼接,并且从这最后两个console.logs我被告知这两个数组是相同的。 (我只想改变Arr2)
答案 0 :(得分:4)
执行Arr2 = Arr1
时,您只是复制对该数组的引用,而不是复制数组本身。因此,Arr1
和Arr2
现在都将引用相同的数组。
尝试更改
Arr2=Arr1
到
Arr2 = Arr1.slice()
应将Arr1
中的所有元素复制到新Arr2
。查看Array.prototype.slice了解详情。
答案 1 :(得分:0)
你可以像这样使用filter Array方法:
var arr2 = arr1.filter(x => x!="to_delete");
答案 2 :(得分:0)
这样想:当你初始化Arr1时,你将它分配给堆上的一块内存。然后给这个参考地址。
作业var Arr2 = Arr1
与说法相同,Arr2与参考作品的Arr1 相同。这意味着它指向相同的内存地址。
如果你想制作一个对象的副本,a.k.a。按值按值传递,你应该使用下列方法之一。
var Arr2 = Arr1.slice(0);
但请记住,如果您的数组包含对象,则使用此方法通过引用克隆这些对象。例如:
var Arr1 = [{a: 1, b: 2, c:3}, {d: 4, e: 5, f: 6}]
var Arr2 = Arr1.slice(0)
Arr1[0].a = 2;
console.log(Arr2[0].a) // this will output 2
如果您想轻松地执行深度克隆而无需编写代码来按值传递对象引用,则可以使用 lodash 或仅使用
之类的内容。var Arr2 = JSON.parse(JSON.stringify(Arr1));
哪个也有效。