2011-02-23 81 views
1

ActionScript的Array和Vector類都有一個slice()方法。如果您未傳遞任何參數,則新的Array或Vector是原始Vector的重複(淺層克隆)。.slice()是一個「淺層克隆」是什麼意思?

成爲「淺層克隆」意味着什麼?具體來說,就是

Array newArray = oldArray.slice(); 
Vector.<Foo> newVector = oldVector.slice(); 

Array newArray = oldArray; 
Vector.<Foo> newVector = oldVector; 

之間的區別?另外,如果Vector的基類型不是Foo,但是像int那樣簡單且不可變的東西呢?

更新:

什麼是下面的結果呢?

var one:Vector.<String> = new Vector.<String>() 

one.push("something"); 
one.push("something else"); 

var two:Vector.<String> = one.slice(); 

one.push("and another thing"); 

two.push("and the last thing"); 

trace(one); // something, something else, and another thing 
trace(two); // something, something else, and the last thing 

謝謝! ♥

回答

1

在你的背景下,什麼.slice()做僅僅是爲了讓你的載體的拷貝,這樣newArray指的是不同的對象從oldArray,除了這兩個看似相同的對象。同樣適用於newVectoroldVector

第二片段:

Array newArray = oldArray; 
Vector.<Foo> newVector = oldVector; 

實際上使newArray一個參考oldArray。這意味着兩個變量都指向相同的數組。相同的newVectoroldVector - 兩個最後指的是相同的載體。把它想象成使用橡皮圖章在不同的紙片上兩次印上相同的印章:這是相同的印章,只在兩張紙上表示。

在一個側面說明,術語淺拷貝在那淺淺深拷貝不同是副本只有對象而深刻的是對象的副本,並將其所有屬性

另外,如果Vector的基類型不是Foo,但是像int那樣簡單且不可變的東西呢?

這是一樣的,因爲您的變量是指Vector對象而不是它們的int s。

以下是什麼結果?

你的輸出是正確的:

 
something, something else, and another thing 
something, something else, and the last thing 

two = one.slice(),不帶任何參數,使得one一個新的副本與當前的所有內容,並將其分配給two。當您將每個第三項推送到onetwo時,您將追加到不同的Vector對象。

+0

你的意思是'oldArray'和'newArray'的內容是相同的對象,但引用是不同的? – Svetlana 2011-02-23 16:35:49

+0

@Svetlana:當'.slice()'不同時,由'oldArray'和'newArray'表示的對象,但如果屬性的引用屬於非原始類型,則它們的屬性引用可能會有所不同。如果你簡單地將一個分配給另一個,那麼它們都是對同一個對象的不同引用。 – BoltClock 2011-02-23 16:37:34