as3での配列の挙動に、今さらはまったので、検証まとめ。
以下の検証用のコードを。
package
{
import com.adobe.utils.ArrayUtil;
import flash.display.Sprite;
import mx.utils.ObjectUtil;
public class testArray extends Sprite
{
public function testArray()
{
/**
* 普通の配列
*/
var a:Array = [ “hokkaido”, “aomori”, “iwate”, “akita” ];
var aCopy:Array = a.concat(); //配列をコピー
trace( “—–” );
trace( “a: ” + a.toString() );
trace( “aCopy: ” + aCopy.toString() );
aCopy.push( “miyagi” );
trace( “—–” );
trace( “a: ” + a.toString() );
trace( “aCopy: ” + aCopy.toString() );
var aCopyTwo:Array = ArrayUtil.copyArray( a ); //配列をコピー
trace( “—–” );
trace( “aCopyTwo: ” + aCopyTwo.toString() );
aCopyTwo.push( “yamagata” );
trace( “—–” );
trace( “a: ” + a.toString() );
trace( “aCopyTwo: ” + aCopyTwo.toString() );
var aCopyThree:Array = a;
aCopyThree.push( “fukushima” );
trace( “—–” );
trace( “a: ” + a.toString() );
trace( “aCopyThree: ” + aCopyThree.toString() );
/**
* Array でハッシュ配列
*/
var b:Array = [];
b[ “hokkaido” ] = “札幌”;
b[ “aomori” ] = “青森”;
b[ “iwate” ] = “盛岡”;
b[ “akita” ] = “秋田”;
var bCopy:Array = b.concat();
trace( “—–” );
trace( “b: ” + b[“hokkaido”] );
trace( “bCopy: ” + bCopy[“hokkaido”] );
bCopy = ArrayUtil.copyArray( b );
trace( “—–” );
trace( “bCopy: ” + bCopy[“hokkaido”] );
/**
* Object でハッシュ配列
*/
var c:Object = {};
c[ “hokkaido” ] = “札幌”;
c[ “aomori” ] = “青森”;
c[ “iwate” ] = “盛岡”;
c[ “akita” ] = “秋田”;
trace( “—–” );
trace( ‘c[“hokkaido”]: ‘ + c[“hokkaido”] );
var cCopy:Object = ObjectUtil.copy( c );
trace( “—–” );
trace( ‘cCopy[“hokkaido”]: ‘ + cCopy[“hokkaido”] );
cCopy[“hokkaido”] = “札幌市”;
trace( “—–” );
trace( ‘c[“hokkaido”]: ‘ + c[“hokkaido”] );
trace( ‘cCopy[“hokkaido”]: ‘ + cCopy[“hokkaido”] );
}
}
}
実行結果は、
----- a: hokkaido,aomori,iwate,akita aCopy: hokkaido,aomori,iwate,akita ----- a: hokkaido,aomori,iwate,akita aCopy: hokkaido,aomori,iwate,akita,miyagi ----- aCopyTwo: hokkaido,aomori,iwate,akita ----- a: hokkaido,aomori,iwate,akita aCopyTwo: hokkaido,aomori,iwate,akita,yamagata ----- a: hokkaido,aomori,iwate,akita,fukushima aCopyThree: hokkaido,aomori,iwate,akita,fukushima ----- b: 札幌 bCopy: undefined ----- bCopy: undefined ----- c["hokkaido"]: 札幌 ----- cCopy["hokkaido"]: 札幌 ----- c["hokkaido"]: 札幌 cCopy["hokkaido"]: 札幌市
結論としては、
- as3でハッシュ配列を使うときは、Array型ではなくObject型
である。
もし、Array型でハッシュ的に配列を使った場合、
- オブジェクトごとのコピーができない。
- Object型でも同じだが、Array.lengthは使えない。
ということになる。