0001 ================数组的浅复制:slice(或concat)================ 
0002 
0003 var objectElement:Object={name:"kingda",web:"www.kingda.org"}; 
0004 var arrayElement:Array=[1,2,3]; 
0005 
0006 var foo:Array=["a string element",arrayElement,objectElement]; 
0007 trace(foo); 
0008 //输出foo的内容:a string element,1,2,3,[object object] 
0009 
0010 //①使用slice方法生成foo的浅复制,赋值给bar 
0011 var bar:Array=foo.slice();//也可以用:foo.concat() 
0012 //②比较foo和bar 
0013 trace(bar); 
0014 //输出浅复制bar的内容:a string element,1,2,3,[object object],果然和foo完全一样 
0015 trace(foo==bar); 
0016 //输出:false 
0017 //因为对于Array这个引用类型,“==”判断的是变量持有对象的引用是否相同,而不是内容相同,由于bar是slice方法返回的一个新数组,因此肯定不和foo变量原有的数组引用相同。 
0018 trace(foo[0]==bar[0]); 
0019 //输出:true 
0020 //注意,第一个元素是值类型,因此“==”是根据值(value)来判断的 
0021 trace(foo[1]==bar[1]);//输出:true 
0022 trace(foo[2]==bar[2]);//输出:true 
0023 //这两个元素是引用类型,“==”是根据引用是否相同来判断的。 
0024 
0025 //③下面我们来挨个改变bar数组的所有元素,再来比较一下foo和bar 
0026 bar[0]="a new string in bar"; 
0027 bar[1][0]=1000; 
0028 bar[2].web="www.ActionScript3.cn"; 
0029 trace(foo); 
0030 //输出:a string element,1000,2,3,[object object] 
0031 //注意,foo中的内容除了第一个元素,其余也跟着bar改变了。改变了bar,同时也改变了foo中引用类型元素的内容 
0032 trace(bar); 
0033 //输出:a new string in bar,1000,2,3,[object object] 
0034 //可以看到,bar除了第一个元素和现在的foo不同外,其余都一样。 
0035 //怎么知道第三个元素也变了呢?我们来trace一下它的web属性 
0036 trace(foo[2].web); 
0037 //输出:www.ActionScript3.cn 
0038 //果然foo中第三个元素的web属性也变了 
0039 trace(bar[2].web); 
0040 //输出:www.ActionScript3.cn 
0041 
0042 ================数组的深复制:ByteArray的运用================ 
0043 
0044 var objectElement:Object={name:"kingda",web:"www.kingda.org"}; 
0045 var arrayElement:Array=[1,2,3]; 
0046 
0047 //①以下4行深复制数组foo 
0048 var fooBA:ByteArray=new ByteArray(); 
0049 fooBA.writeObject(foo); 
0050 fooBA.position=0; 
0051 var bar:Array=fooBA.readObject() as Array; 
0052 trace(bar); 
0053 //输出:a string element,1,2,3,[object object] 
0054 
0055 //②比较foo和bar 
0056 trace(foo==bar); 
0057 //输出:false 
0058 //表明foo和bar持有的是两个不同对象的引用 
0059 trace(foo[0]==bar[0]); 
0060 //输出:true 
0061 //由于第一个元素是String类型,因此“==”判断值相等,返回真。 
0062 trace(foo[1]==bar[1]);//输出:false 
0063 //第二个元素是Array类型,因此“==”判断引用是否相同,若不同,则返回假。 
0064 trace(foo[2]==bar[2]);//输出:false 
0065 //第三个元素是Object类型,因此“==”判断引用是否相同,若不同,则返回假。 
0066 
0067 //③以下3行改变bar的元素,再看foo是否受到影响 
0068 bar[0]="a new string in bar"; 
0069 bar[1][0]=1000; 
0070 bar[2].web="www.ActionScript3.cn"; 
0071 trace(foo); 
0072 //输出:a string element,1,2,3,[object object] 
0073 trace(bar); 
0074 //输出:a new string in bar,1000,2,3,[object object] 
0075 trace(foo[2].web); 
0076 //输出:www.kingda.org 
0077 trace(bar[2].web); 
0078 //输出:www.ActionScript3.cn 
0079 //可以看出,bar的改变并没有影响到foo,确确实实把所有元素都复制了。