PDA

Просмотр полной версии : Особенности итерации for(in) для Array в AS3


KumoKairo
04.06.2013, 17:01
Раз уж добрался до форума, вот еще вопрос прошаренным товарищам
Не так давно наткнулся на вопрос на stackoverflow начет сравнения скорости выполнения обычного
for (var i:uint = 0; i < n; i++)
и for in
for (var i:String in something)
Прямую ссылку, к сожалению, потерял, но суть была такая:
Весь трюк итерации по Array с помощью for in заключался в создании объекта i типа String и использовании i в качестве индекса:
var items:Array = ["hi", "there", "bob"];
for (var index:String in items) {
trace(index+" => "+items[index]); // traces "0 => hi", "1 => there" and "2 => bob"
}
Ответ приняли как верный и сказали, что да, этот способ быстрее чем если делать интовый i

Собственно, сам вопрос. Почему для доступа к элементам массива по индексу используется величина типа String (нельзя определить i как число), что в данном случае передается в i?
Я просто привык к синтаксису java, где в цикле мы прямо указывали класс и обращались с переменной как с объектом класса.

В документации написано, что можно использовать этот метод для итерации через свойства объекта или элементы класса
The for..in loop iterates through the properties of an object, or the elements of an array. For example, you can use a for..in loop to iterate through the properties of a generic object (object properties are not kept in any particular order, so properties may appear in a seemingly random order):

СлаваRa
04.06.2013, 17:05
Я бы не рекомендовал вам использовать for in для обхода элементов массива по индексу, используйте этот цикл по месту для Object и Dictionary, и про скорость, я думаю, вы что-то напутали.


const textField:TextField = new TextField()
textField.width = 100;
textField.height = 100;
textField.border = true;

const a:Array = [];
for(var i:int = 0; i < 1000000; i++) {
a[i] = i;
}

var startTime:int = getTimer();
for(var name:String in a) {
a[name];
}
//trace(getTimer() - startTime);//2969
textField.appendText((getTimer() - startTime).toString());//2750
textField.appendText("\n");

startTime = getTimer();
for(var j:int = 0; j < 1000000; j++) {
a[j];
}
//trace(getTimer() - startTime);//66
textField.appendText((getTimer() - startTime).toString());//5
addChild(textField);

KumoKairo
04.06.2013, 17:11
Вот и мне этот ответ показался странным, но там его приняли как идеальный и верный. если найду, скину ссылку

MikroAcse
04.06.2013, 19:46
Почему для доступа к элементам массива по индексу используется величина типа String (нельзя определить i как число)
Потому что "Array extends Object" и индекс - это просто ключ (key) к объекту.

var obj:Object = {};
obj['0'] = 'hi';

var obj:Object = {};
obj[1] = 'hello';

var arr:Array = [];
arr['0'] = 'hi';

var arr:Array = [];
arr[1] = 'hello';


Эти записи идентичны.

caseyryan
04.06.2013, 21:40
Я просто привык к синтаксису java, где в цикле мы прямо указывали класс и обращались с переменной как с объектом класса.
В джаве нет такого цикла (как for in в as3). Там
for(SomeType someObj : someObjects) {}
аналог for each in из ас3.
Поэтому в ас3 тоже можно сделать примерно как в джаве

for each (var someObj:SomeType in someObjects) {
// что-то
}