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

Posted

技术标签:

【中文标题】从 ActionScript 数组中删除所有元素的最佳方法?【英文标题】:Best way to remove all elements from an ActionScript Array? 【发布时间】:2010-12-01 12:43:09 【问题描述】:

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

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

我注意到 ArrayCollection 类有一个函数 removeAll() 可以做到这一点,但基本的 Array 类没有。我考虑过的一些可能性是:

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

【问题讨论】:

【参考方案1】:

根据this test,最好的方法是设置length = 0

【讨论】:

【参考方案2】:

我不敢说,但 Warren Young 说设置 myArray = [] 会导致垃圾收集器拾取数组时是错误的。

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

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

彻底清除数组并确保它被垃圾收集

myArray.splice(0);
myArray = null;

【讨论】:

【参考方案3】:

这取决于您的上下文。虽然使用杨先生的答案通常是最正确的做事方式,但它并不总是有效,尤其是当您有两个变量指向同一个数组时:

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

【讨论】:

while(bar.length > 0) bar.shift(); // :) bar.splice(0); // 不需要循环 :)【参考方案4】:

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

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

arr.splice(0, arr.length);

【讨论】:

arr.splice(0);或更好:arr.length = 0;【参考方案5】:

我会说:

myArray = [ ];

这是明确的、简短的,并且很好地利用了 VM 的垃圾收集器。

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

我不知道第二个做你想要的;如果是这样,那就太老套了,不清楚。

第三种选择的“new Array()”变体只是冗长,与数组文字相比没有任何优势。如果你也写 JS 并使用JSLint,你会因为不使用数组字面量形式而被骂。

【讨论】:

Set length = 0 并不像官方 as3 lang ref 提到的那样是 hacky:help.adobe.com/en_US/AS3LCR/Flash_10.0/Array.html#length。我个人也使用这种方法。我同意 Christopher W. Allen-Poole 的观点,即您的方法实际上并未清除数组。 myArray.length = 0 更不清楚,因为它引入了数组的不必要的描述性组件,而应该传达给读者的只是“删除数组”。长度设置器的截断功能最初让我觉得是一种额外的好处。无论如何,Christopher W. Allen-Poole (cwallenpoole) 的回应很有道理,而且似乎更明显一些,因为“拼接”操作更直接,并且专门设计用于删除项。

以上是关于从 ActionScript 数组中删除所有元素的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 从关联数组中删除元素

ActionScript 3 AS3从数组中删除元素

Actionscript 3:当元素是对象/类实例时,识别要删除的数组元素

ActionScript 3 从显示对象中删除所有子项

ActionScript 3 从TextFlow中删除所有FlowElement对象

如何从数组中删除所有元素[重复]