从ActionScript数组中删除所有元素的最佳方法?

时间:2009-09-25 18:57:41

标签: flex actionscript-3 actionscript

我正在使用Flex / ActionScript编写应用程序,并且有许多类存储数据的类成员变量。

我的问题是:清除Array对象的“最佳”方法是什么?

我注意到ArrayCollection类有一个函数removeAll()来执行此操作,但基本的Array类没有。我考虑过的一些可能性是:

  • 遍历数组,调用pop或shift on each元素
  • 将数组长度设置为0
  • 将成员变量设置为“new Array()”或“[]”

5 个答案:

答案 0 :(得分:15)

我会说:

myArray = [ ];

这是明确的,简短的,并且充分利用了VM的垃圾收集器。

您的第一个替代方案会运行大量解释代码以获得相同的结果。

我不知道第二个做你想要的;如果确实如此,那就是黑客,不清楚。

第三种替代方案的“new Array()”变体只是罗嗦,没有优于数组文字的优势。如果您还编写JS并使用JSLint,那么您将因为不使用数组文字形式而大喊大叫。

答案 1 :(得分:14)

我不敢说,但Warren Young说他设置myArray = []导致垃圾收集器拿起阵列时错了。

因为你能够在自身内部添加引用,因此永远不会被收集并使用内存,特别是如果数组中有一些Sprite,因为它们也会让数组引用它们永远不会被收集。

Sly_cardinal和Richard Szalay是100%正确的。但理查德不需要长度参数。

要完全清除阵列并确保其被垃圾收集,然后

myArray.splice(0);
myArray = null;

答案 2 :(得分:8)

这取决于您的背景。虽然使用Young先生的答案通常是最正确的做法,但它并不总是有效,特别是如果你有两个指向同一个数组的变量:

var foo:Array
var bar:Array
foo = bar = [ 1, 2, 3 ];
bar = [];
trace( foo ); // 1,2,3

另一方面,如果您实际手动清空阵列:

var foo:Array
var bar:Array
foo = bar = [ 1, 2, 3 ];
var l:int = bar.length; // get the length FIRST! 
                        // Otherwise bar.length will change
                        // while you iterate!

for( var i:int = 0; i < l; i++ )
{
    bar.shift();
}
trace( foo ); // does not trace anything

答案 3 :(得分:7)

如果你可以修改数组引用,那么我会选择Warren的答案。如果您需要修改现有实例,还可以使用Array.splice

var arr : Array = [1, 2, 3, 4, 5];

arr.splice(0, arr.length);

答案 4 :(得分:1)

根据this test最佳方式是设置 length = 0