Apache flex 从ActionScript数组中删除所有元素的最佳方法?
我正在用Flex/ActionScript编写一个应用程序,其中有许多存储数据的数组类型的类成员变量 我的问题是:清除数组对象的“最佳”方法是什么 我注意到ArrayCollection类有一个函数removeAll(),它可以实现这一点,但基本数组类没有。我考虑过的一些可能性是:Apache flex 从ActionScript数组中删除所有元素的最佳方法?,apache-flex,actionscript-3,actionscript,Apache Flex,Actionscript 3,Actionscript,我正在用Flex/ActionScript编写一个应用程序,其中有许多存储数据的数组类型的类成员变量 我的问题是:清除数组对象的“最佳”方法是什么 我注意到ArrayCollection类有一个函数removeAll(),它可以实现这一点,但基本数组类没有。我考虑过的一些可能性是: 遍历数组,对每个元素调用pop或shift 将数组长度设置为0 将成员变量设置为“新数组()”或“[]” 我想说: myArray = [ ]; 这是显式的、简短的,并且很好地利用了VM的垃圾收集器 您的第一个备
- 遍历数组,对每个元素调用pop或shift
- 将数组长度设置为0
- 将成员变量设置为“新数组()”或“[]”
- 我想说:
myArray = [ ];
这是显式的、简短的,并且很好地利用了VM的垃圾收集器
您的第一个备选方案运行大量解释代码以获得相同的结果
我不知道第二个是你想要的;如果是的话,那就不清楚了
第三个备选方案的“new Array()”变体非常冗长,与数组文本相比没有任何优势。如果您还编写JS并使用它,您将因未使用数组文本形式而受到指责。这取决于您的上下文。虽然使用杨先生的答案通常是最正确的方法,但它并不总是有效的,特别是如果有两个变量指向同一个数组:
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
var-foo:Array
变量栏:数组
foo=bar=[1,2,3];
变量l:int=bar.length;//先看长度!
//否则,bar.length将更改
//当你迭代的时候!
对于(变量i:int=0;i
如果你能修改数组引用,那么我会同意沃伦的答案。如果需要修改现有实例,还可以使用:
我不敢说,但是Warren Young说设置myArray=[]会导致垃圾收集器拾取数组是错误的 因为您能够在自身中添加对自身的引用,因此将永远不会被收集并耗尽内存,特别是当阵列中有一些精灵时,因为它们也会让阵列引用它们,并且它们也永远不会被收集 Sly_cardinal和Richard Szalay是100%正确的。但是Richard的中不需要长度参数 要完全清除阵列并确保其已被垃圾收集,请执行以下操作:
myArray.splice(0);
myArray = null;
根据的说法,最好的方法是设置
长度=0
设置长度=0并不像官方的as3 lang ref所提到的那样,不太老套。我个人也使用这种方法。我同意Christopher W.Allen Poole的观点,即您的方法实际上并没有清除数组。myArray.length=0更不清楚,因为它引入了一个不必要的数组描述组件,而所有应该传达给读者的都是“删除数组”。长度设定器的截断功能最初给我的印象是一种额外的好处。无论如何,Christopher W.Allen Poole(cwallenpoole)的响应很有意义,而且似乎更明显,因为“拼接”操作更具字面意义,专门用于删除项。while(bar.length>0)bar.shift();/:)钢筋接头(0);//无需环路:)阵列拼接(0);或更好:arr.length=0;
myArray.splice(0);
myArray = null;