var arr:Array = [1,2,3,4];
var copyArr:Array = arr.concat();
for(var i:uint=0;i<copyArr.length;i++)
{
trace("原数组:",arr[i]);
copyArr[i] += 1;
trace("复制数组",copyArr[i]);
trace("复制数组修改后的原数组:",arr[i]);
}
(tip: 将concat改成slice也可以测试下....)
输出结果:
原数组: 1
复制数组 2
复制数组修改后的原数组: 1
原数组: 2
复制数组 3
复制数组修改后的原数组: 2
原数组: 3
复制数组 4
复制数组修改后的原数组: 3
原数组: 4
复制数组 5
复制数组修改后的原数组: 4
通过测试不难看出,用as3中Array封装的方法复制的简单数组,当复制的数组的值改变的时候,原数组的值并没有跟着改变。可能你觉得有点疑惑,到底要干什么呢?接下来再看个例子:
var arr:Array = [{n:1},{n:2},{n:3}];
var copyArr:Array = arr.concat();
for(var i:uint=0;i<copyArr.length;i++)
{
trace("原数组:",arr[i].n);
copyArr[i].n += 1;
trace("复制数组",copyArr[i].n);
trace("复制数组修改后的原数组:",arr[i].n);
}
输出结果:
原数组: 1
复制数组 2
复制数组修改后的原数组: 2
原数组: 2
复制数组 3
复制数组修改后的原数组: 3
原数组: 3
复制数组 4
复制数组修改后的原数组: 4
看看结果,这回该明白了吧...复制数组修改后的原数组的值奇妙的发生了改变.....
具体原因自己还不是很清楚,游戏中,当要复制一个数组而不影响原数组的时候问题就来了,那么如何深拷贝一个数组呢?很可以在as3中找不到像java中的copy方法,这里提供一个小技巧,还是先看代码吧:
var arr1:Array = [{n:1},{n:2},{n:3}];
var copier:ByteArray = new ByteArray();
copier.writeObject(arr1);
copier.position = 0;
var copyArr:Array = copier.readObject();
for(var i:uint=0;i<copyArr.length;i++)
{
trace("原数组:",arr1[i].n);
copyArr[i].n += 1;
trace("复制数组",copyArr[i].n);
trace("复制数组修改后的原数组:",arr1[i].n);
}
输出结果:
原数组: 1
复制数组 2
复制数组修改后的原数组: 1
原数组: 2
复制数组 3
复制数组修改后的原数组: 2
原数组: 3
复制数组 4
复制数组修改后的原数组: 3
结果一目了然,颜色改变部分的代码就是本帖的精华所在......实现原理:大家可以查看帮助文档中 ByteArray 类的说明,这样就完成了数组的深copy。
游戏中对数组的运用还是比较多的,这类应用也不在少数,虽然绕个弯路是问题解决了,但我也不大清楚,as3中数组的引用是如何处理的...有知道的朋友不妨留言...谢谢...也可直接告诉我一下哦。
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |