数组函数不需要的双重赋值

时间:2016-10-03 19:15:59

标签: javascript jquery

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)

3 个答案:

答案 0 :(得分:4)

执行Arr2 = Arr1时,您只是复制对该数组的引用,而不是复制数组本身。因此,Arr1Arr2现在都将引用相同的数组。

尝试更改

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的引用,而不是新对象。 想一想: enter image description here

这样想:当你初始化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));

哪个也有效。