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

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

Мой вопрос: какой "лучший" способ очистить объект Array?

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

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

Ответы

Ответ 1

Я бы сказал:

myArray = [ ];

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

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

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

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

Ответ 2

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

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

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

Ответ 4

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

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

arr.splice(0, arr.length);

Ответ 5

В соответствии с этот тест лучший способ установить длину = 0