var ary:Array = ["string","string","string"];
var copy_ary:Array = ary;
trace(copy_ary);//string,string,string
ary[1]=false;
trace(copy_ary);//string,false,string
我想要做的就是复制数组ary,而不会根据原始版本不断更改副本。我是否必须创建一个带循环的副本(例如下面的内容)?
var ary:Array = ["string","string","string"];
var copy_ary:Array = [];
for(var i=0;i<ary.length;i++){
copy_ary[i]=ary[i];
}
显然这是可行的,但考虑到人们不会认为复制的数组会始终与原始数据保持一致,这似乎是很多工作。有人可以告诉我为什么会这样吗?
答案 0 :(得分:2)
在第一个示例中,您没有创建新数组 - 您创建了对现有数组的新引用(因此您有2个引用但只有1个数组)。当您通过一个引用修改数组时,您也会看到通过另一个引用的更改(因为您实际上只有一个数组)。
要创建数组的独立副本,您需要实际创建一个新的数组实例,然后复制这些项目。这可以通过shallow or through a deep copy完成。
简而言之,可以使用Array.concat()
或Array.slice()
方法(或使用循环,如第二个示例中)创建浅表副本。对于深层复制,您还必须复制数组中的对象 - 这可能需要更多代码,具体取决于数组中的对象类型。
当你的数组只包含原始(或类似pimitive)类型时,浅拷贝通常就足够了 - 如果你的数组只有字符串,那么浅拷贝应该足够了,因为String
表现得像一个原始类型,即使这是一个复杂的对象。
阅读this article了解详情。