Лучший способ удалить все элементы из массива 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