Вобщем да, причина понятна, тут либо массив каждый раз создавать либо итератор. Массив создать проще, меня смущает только то что:
- создание массива может ввести в заблуждение - клиент класса может подумать, что он вправе его менять (и удивляться, почему ничего не изменяется);
- копирование массива обходится дороже создания итератора (сомневаюсь, что тест лажает из-за оптимизации кода компилятором):

Код AS3:
package
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
public class ArrayCopyTest extends Sprite
{
public function ArrayCopyTest()
{
var tf:TextField = new TextField();
addChild(tf);
var array:Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
var timer:int;
var i:int;
timer = getTimer();
for (i = 100000; i-- > 0; )
{
var iterator:Iterator = new Iterator(array);
}
tf.appendText(String(getTimer() - timer) + "\n");// 33
timer = getTimer();
for (i = 100000; i-- > 0; )
{
var arrayCopy:Array = array.concat();
}
tf.appendText(String(getTimer() - timer) + "\n");// 128
}
}
}class Iterator
{
private var _array:Array;
private var _currentIndex:int = 0;
public function Iterator(array:Array)
{
_array = array;
}
public function get hasNext():Boolean
{
return _currentIndex < _array.length - 1;
}
public function next():Object
{
return _array[_currentIndex++];
}
}