我正在使用Flex/ActionScript编写应用程序,并且有许多类存储数据的类成员变量.
我的问题是:清除Array对象的"最佳"方法是什么?
我注意到ArrayCollection类有一个函数removeAll()来执行此操作,但基本的Array类没有.我考虑过的一些可能性是:
遍历数组,在每个元素上调用pop或shift
将数组长度设置为0
将成员变量设置为"new Array()"或"[]"
Warren Young.. 15
我会说:
myArray = [ ];
这是明确的,简短的,并充分利用了VM的垃圾收集器.
您的第一个替代方案会运行大量解释代码以获得相同的结果.
我不知道第二个做你想要的; 如果确实如此,那就是hacky,不清楚.
第三种替代方案的"new Array()"变体只是罗嗦,没有优于数组文字的优势.如果您还编写JS并使用JSLint,那么您将因为不使用数组文字形式而大喊大叫.
我会说:
myArray = [ ];
这是明确的,简短的,并充分利用了VM的垃圾收集器.
您的第一个替代方案会运行大量解释代码以获得相同的结果.
我不知道第二个做你想要的; 如果确实如此,那就是hacky,不清楚.
第三种替代方案的"new Array()"变体只是罗嗦,没有优于数组文字的优势.如果您还编写JS并使用JSLint,那么您将因为不使用数组文字形式而大喊大叫.
我不敢说,但是当他说设置myArray = []导致垃圾收集器拿起阵列时,Warren Young错了.
因为你有能力在自身内部添加一个引用,因此永远不会被收集和使用内存,特别是如果数组中有一些Sprite,因为它们也会让数组引用它们,它们也永远不会被收集.
Sly_cardinal和Richard Szalay是100%正确的.但理查德不需要长度参数.
要完全清除阵列并确保它被垃圾收集
myArray.splice(0); myArray = null;
这取决于你的背景.虽然使用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
如果你可以修改数组引用,那么我会选择Warren的答案.如果需要修改现有实例,还可以使用Array.splice:
var arr : Array = [1, 2, 3, 4, 5]; arr.splice(0, arr.length);