Лучший способ удалить все элементы из массива ActionScript?

Я пишу приложение на Flex / ActionScript, и у меня есть несколько переменных-членов класса типа Array, в которых хранятся данные.

У меня вопрос: как лучше всего очистить объект Array?

Я заметил, что в классе ArrayCollection есть функция removeAll (), которая делает это, а в базовом классе Array - нет. Я рассмотрел следующие возможности:

  • Итерации по массиву, вызовы pop или shift для каждого элемента
  • Установка длины массива на 0
  • Установка переменной-члена в «новый массив ()» или «[]»

person Chris R    schedule 25.09.2009    source источник


Ответы (5)


Я бы сказал:

myArray = [ ];

Это явно, кратко и хорошо использует сборщик мусора виртуальной машины.

Ваша первая альтернатива запускает много интерпретируемого кода, чтобы получить тот же результат.

Я не знаю, что второй делает то, что вы хотите; если да, то это взломано, непонятно.

Вариант третьей альтернативы new Array () просто многословен и не дает никаких преимуществ перед литералом массива. Если вы также пишете JS и используете JSLint, на вас будут кричать за то, что вы не используете буквальную форму массива.

person Warren Young    schedule 25.09.2009
comment
Установка length = 0 не является хакерской, поскольку об этом упоминается в официальном справочнике as3 lang: help.adobe.com/en_US/AS3LCR/Flash_10.0/Array.html#length. Я лично тоже использую этот метод. И я согласен с Кристофером В. Аллен-Пулом в том, что ваш метод на самом деле не очищает массив. - person Andy Li; 26.09.2009
comment
myArray.length = 0 более неясен в том смысле, что он вводит ненужный описательный компонент массива, когда все, что должно быть передано читателю, - это массив удаления. Функция усечения в установщике длины поначалу показалась мне своего рода дополнительным бонусом. Во всяком случае, ответ Кристофера В. Аллен-Пула (cwallenpoole) имеет большой смысл и кажется немного более очевидным, поскольку операция объединения более буквальна и предназначена специально для удаления элементов. - person Pup; 08.02.2014

Боюсь сказать, но Уоррен Янг ошибся, когда сказал, что установка myArray = [] заставляет сборщик мусора подбирать массив.

поскольку у вас есть возможность добавить ссылку на себя в самом себе, и поэтому никогда не будет собираться и использоваться память, особенно если в массиве есть несколько спрайтов в массиве, поскольку они тоже будут ссылаться на массив, и они тоже никогда не будут быть собранным.

Sly_cardinal и Ричард Салай правы на 100%. но параметр длины в Ричарде не нужен.

Чтобы полностью очистить массив и убедиться, что он собран мусором, тогда

myArray.splice(0);
myArray = null;
person WORMSS    schedule 08.07.2010

Это зависит от вашего контекста. Хотя использование ответа г-на Янга часто является наиболее правильным способом решения задач, он не всегда будет работать, особенно если у вас есть две переменные, указывающие на один и тот же массив:

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
person cwallenpoole    schedule 25.09.2009
comment
while (bar.length ›0) bar.shift (); // :) - person Brian Hodge; 26.09.2009
comment
bar.splice (0); // Цикл не нужен :) - person Sly_cardinal; 28.09.2009

Если вы можете изменить ссылку на массив, я бы пошел с ответом Уоррена. Если вам нужно изменить существующий экземпляр, вы также можете использовать Array.splice:

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

arr.splice(0, arr.length);
person Richard Szalay    schedule 26.09.2009
comment
arr.splice (0); или лучше: arr.length = 0; - person Alexander Farber; 31.03.2012

Согласно этому тесту лучший способ - установить length = 0

person Denis Maslov    schedule 27.01.2016