配列のコピー

Flash Player 9 以降、Adobe AIR 1.0 以降

Array クラスには、配列のコピーを作成する組み込みメソッドは用意されていません。 配列の 浅い コピー は、 concat() または slice() メソッドをパラメーターなしで呼び出すことで作成できます。浅いコピーでは、オブジェクトである要素が元の配列に格納されている場合、コピーした配列内の要素は元の要素に格納されているオブジェクトへの参照となり、参照先オブジェクトはコピーされません。 したがって、元の配列とコピーした配列が同一のオブジェクトを参照することになり、 オブジェクトが変更されると、両方の配列に対してその変更が反映されます。

深いコピー とは、元の配列内で参照されているオブジェクトをすべてコピーすることです。その場合、元の配列とコピーした配列が同一のオブジェクトを参照する結果にはなりません。深いコピーを実行するには複数行のコードを記述する必要があり、通常、何らかの関数を作成することになります。 こうした関数は、グローバルなユーティリティ関数として作成するか、または Array のサブクラスにメソッドとして作成することができます。

次の例では、深いコピーを実行するための clone() という関数を定義しています。採用したアルゴリズムは、Java プログラミングで一般的に使用されているテクニックです。 まず元の配列を直列化して ByteArray クラスのインスタンスを作成し、それを新しい配列に読み込むことでコピーを実行しています。 次のコードに示されているとおり、この関数はオブジェクトを受け付けるため、インデックス配列と結合配列の両方で使用できます。

import flash.utils.ByteArray; 
 
function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
}