如何在ActionScript 3中创建数组的浅表副本

时间:2011-04-27 13:12:53

标签: actionscript-3 flex flex3

var a:Array = ["a","b","c"];

var b:Array;

/* insert code here to copy 'a' and assign it to 'b'*/

3 个答案:

答案 0 :(得分:11)

取自As3参考指南:

  

Array类没有内置功能   制作数组副本的方法。   您可以创建一个浅表副本   通过调用concat()数组   或者没有参数的slice()方法。   在浅拷贝中,如果是原始的   array包含作为对象的元素,   只有对象的引用   复制而不是对象   他们自己。副本指向   与原始对象相同的对象。任何   对对象所做的更改   反映在两个阵列中。

如果你在concat和slice之间做出选择,那么Concat将是你要走的路,因为concat在性能方面更快。

在此处详细了解该主题:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html

澄清:

    private function shallowCopy():void{
        var a:Array = ["h", "e", "l", "l", "o"];
        var b:Array = a.concat(); 

        trace("Shallow copy:");
        trace("Before delete: " + a);
        trace("Before delete: " + b);
        delete a[0];
        trace("After delete: " + a);
        trace("After delete: " + b);            
    }

答案 1 :(得分:8)

有问题的一行:

var b:Array = a.concat();

答案 2 :(得分:0)

如果数组只包含字符串或数字值,则足以制作“浅”副本,如Adam和rzetterberg所述。

如果数组包含其他数组或对象/类实例等,那么如果您需要内部的所有对象都是唯一的而不仅仅是引用,那么您应该进行深层复制。您可以通过以下方式实现这一目标:

var ba:ByteArray = new ByteArray(); 
ba.writeObject(a); // Copy the original array (a) into a ByteArray instance
ba.position = 0; // Put the cursor at the beginning of the ByteArray to read it
var b:Array = ba.readObject(); // Store a copy of the array in the destination array (b)
ba.clear(); // Free memory

这对于复制没有任何连接或拼接方法的对象也很有用。