今天,在做一个的项目。遇到Vector的深复制,发现复制竟然不成功。(Vector里边存储的复杂数据MovieClip)。今天先记录这里,下次再研究。在想办法解决ing。 下边先进行些简单的测试。然后,用网上的方法测试。先看code:
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.utils.ByteArray; public class ArrayCopy extends Sprite { public function ArrayCopy() { var a:Array = [1 , 2 , 3]; var b:Array = a; a.splice(0); trace("1_1 a:"+ a , "b:" + b); //输出:1_1 a: b: b = []; a = [1 , 2 , 3]; b = a; b.splice(0); trace("1_2 a:"+ a , "b:" + b); //输出: 1_2 a: b: b = []; a = [1 , 2 , 3]; b = a; a[0] = 2; trace("1_3 a:"+ a , "b:" + b); //输出:1_3 a:2,2,3 b:2,2,3 /* 通过以上的测试,能够知道,数组间的直接赋值,改变了任意一个数组里边的元素,
另外一个也会改变。无论数据是基元数据类型还是复杂数据类型
*/ b = []; a = [1,2,3]; b = a.slice(); a.splice(0); trace("2 a:"+ a , "b:" + b); //输出:2 a: b:1,2,3 b = []; a = [1,2,3]; b = a.concat(); a.splice(0); trace("3 a:"+ a , "b:" + b); //输出:3 a: b:1,2,3 b = []; a = [1,2,3]; for each(var i:int in a) { b.push(i); } a.splice(0); trace("4 a:"+ a , "b:" + b); //输出:4 a: b:1,2,3 /* 通过以上的测试,能够知道,基元数据类型的浅复制,改变了一个数组,另外一个数组不会改变
*/ b = []; a = [ 1 , "vini" , true]; b = a.slice(); a[0] = "gg" ; a[1] = 2; a[2] = false; trace("5 a:"+ a , "b:" + b); //输出:5 a:gg,2,false b:1,vini,true b= []; a = [1 , [1 , 2],3]; b = a.slice(); a[1] = [100,200]; trace("6 a:"+ a , "b:" + b); //输出:6 a:1,100,200,3 b:1,1,2,3 b= []; a = [1 , {a:1,b:2},3]; b = a.slice(); a[1].a = 100; a[1].b = 200; trace("7 a:"+ a[1].a , "b:" + b[1].a); //输出:7 a:100 b:100 /* 通过以上的测试,能够知道,基元数据类型的浅复制,改变了一个数组,
另外一个数组不会改变(如果是Array其内层值也是基元数据类型),
复杂数据类型则会改变
*/ b= []; a = [1 , {a:1,b:2},3]; var byteArray:ByteArray = new ByteArray(); byteArray.writeObject(a); byteArray.position = 0; b = byteArray.readObject(); a[1].a = 100; a[1].b = 200; trace("8 a:"+ a[1].a , "b:" + b[1].a); //输出 8 a:100 b:1 b= []; var mc:MovieClip = new MovieClip(); mc.id = 5; a = [1 , mc , 3]; byteArray = new ByteArray(); byteArray.writeObject(a); byteArray.position = 0; b = byteArray.readObject(); (a[1] as MovieClip).id = 500; trace("9 a:"+ a[1] , "b:" + b[1]); //输出 9 a:[object MovieClip] b:undefined /* 通过以上的测试,能够知道,数据的深复制,像MovieClip这样的复杂数据,
不能深复制成功,object里边如果是基元数据,可以深复制成功
*/
var roll:Roll = new Roll(); roll.id = 5; b = []; a = [1 , roll , 3]; byteArray = new ByteArray(); byteArray.writeObject(a); byteArray.position = 0; b = byteArray.readObject(); roll.id = 500; trace("10 a:"+ a[1].id , "b:" + b[1].id , "b:" + b[1].mc);
//输出 10 a:500 b:5 b:undefined /* 通过以上的测试,能够知道,普通的类可以深复制,像MovieClip这样的复杂数据,
不能深复制成功。
*/
}
}
}
浙公网安备 33010602011771号