数组的深复制和浅复制

================数组的浅复制: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,确确实实把所有元素都复制了。
原文地址:https://www.cnblogs.com/leon3286/p/1704430.html