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,确确实实把所有元素都复制了。
浅复制和深复制
精选 转载下一篇:视频播放器
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
jquery浅复制和深复制区别
jquery浅复制和深复制区别 jquery浅复制和深复制区别
jquery 浅复制 深复制 -
C++深复制和浅复制
C++深复制和浅复制
C++ 浅复制 -
深复制和浅复制(深拷贝和浅拷贝)
讲解深浅拷贝在C++中的应用。
深复制和浅复制、深拷贝和浅拷贝