我正在使用Flex / ActionScript编写应用程序,并且有许多类存储数据的类成员变量。
我的问题是:清除Array对象的“最佳”方法是什么?
我注意到ArrayCollection类有一个函数removeAll()来执行此操作,但基本的Array类没有。我考虑过的一些可能性是:
答案 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