2014-05-06 75 views
1
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]; 
} 

顯然,這工作,但似乎很多工作考慮一個也不會想到複製的數組會不斷地停留在原來一樣擺在首位。有人能告訴我這是爲什麼嗎?

回答

2

在你的第一個例子中,你沒有創建一個新的數組 - 你創建了一個已經存在的數組的新引用(所以你有2個引用,但有1個數組)。當你通過一個引用修改數組時,你也會看到其他引用的變化(因爲你實際上只有一個數組)。

要創建一個數組的獨立副本,您需要實際創建一個新的數組實例,然後複製項目。這可以通過shallow or through a deep copy完成。

簡而言之,可以使用Array.concat()Array.slice()方法(或使用循環,如第二個示例中所示)創建淺表副本。對於深層副本,您還必須複製數組內的對象 - 這可能需要更多代碼,具體取決於數組中的對象類型。

當您的陣列只包含原語(或pimitive樣)類型,淺拷貝通常是不夠的 - 如果你的數組只有字符串,淺表副本應該是因爲String行爲就像即使它是一個複雜的一個primitve類型足夠目的。

閱讀this article瞭解更多信息。