================数组的浅复制:slice(或concat)================ var objectElement:Object={name:"kingda",web:"www.kingda.org"}; var arrayElement:Array=[1,2,3]; var foo:Array=["a string element",arrayElement,objectElement]; trace(foo); //输出foo的内容:a string element,1,2,3,[object object] //①使用slice方法生成foo的浅复制,赋值给bar var bar:Array=foo.slice();//也可以用:foo.concat() //②比较foo和bar trace(bar); //输出浅复制bar的内容:a string element,1,2,3,[object object],果然和foo完全一样 trace(foo==bar); //输出:false //因为对于Array这个引用类型,“==”判断的是变量持有对象的引用是否相同,而不是内容相同,由于bar是slice方法返回的一个新数组,因此肯定不和foo变量原有的数组引用相同。 trace(foo[0]==bar[0]); //输出:true //注意,第一个元素是值类型,因此“==”是根据值(value)来判断的 trace(foo[1]==bar[1]);//输出:true trace(foo[2]==bar[2]);//输出:true //这两个元素是引用类型,“==”是根据引用是否相同来判断的。 //③下面我们来挨个改变bar数组的所有元素,再来比较一下foo和bar bar[0]="a new string in bar"; bar[1][0]=1000; bar[2].web="www.ActionScript3.cn"; trace(foo); //输出:a string element,1000,2,3,[object object] //注意,foo中的内容除了第一个元素,其余也跟着bar改变了。改变了bar,同时也改变了foo中引用类型元素的内容 trace(bar); //输出:a new string in bar,1000,2,3,[object object] //可以看到,bar除了第一个元素和现在的foo不同外,其余都一样。 //怎么知道第三个元素也变了呢?我们来trace一下它的web属性 trace(foo[2].web); //输出:www.ActionScript3.cn //果然foo中第三个元素的web属性也变了 trace(bar[2].web); //输出:www.ActionScript3.cn ================数组的深复制:ByteArray的运用================ var objectElement:Object={name:"kingda",web:"www.kingda.org"}; var arrayElement:Array=[1,2,3]; //①以下4行深复制数组foo var fooBA:ByteArray=new ByteArray(); fooBA.writeObject(foo); fooBA.position=0; var bar:Array=fooBA.readObject() as Array; trace(bar); //输出:a string element,1,2,3,[object object] //②比较foo和bar trace(foo==bar); //输出:false //表明foo和bar持有的是两个不同对象的引用 trace(foo[0]==bar[0]); //输出:true //由于第一个元素是String类型,因此“==”判断值相等,返回真。 trace(foo[1]==bar[1]);//输出:false //第二个元素是Array类型,因此“==”判断引用是否相同,若不同,则返回假。 trace(foo[2]==bar[2]);//输出:false //第三个元素是Object类型,因此“==”判断引用是否相同,若不同,则返回假。 //③以下3行改变bar的元素,再看foo是否受到影响 bar[0]="a new string in bar"; bar[1][0]=1000; bar[2].web="www.ActionScript3.cn"; trace(foo); //输出:a string element,1,2,3,[object object] trace(bar); //输出:a new string in bar,1000,2,3,[object object] trace(foo[2].web); //输出:www.kingda.org trace(bar[2].web); //输出:www.ActionScript3.cn //可以看出,bar的改变并没有影响到foo,确确实实把所有元素都复制了。