ОБНОВЛЕНИЕ 2011.09.13 Эта ошибка была устранена Adobe.Пример кода ниже теперь демонстрирует правильное поведение.Оригинальный вопрос ниже.
Мне понадобилось много часов, чтобы сузить проблему в некотором коде до этой воспроизводимой ошибки, которая кажется мне ошибкой в AVM2.Кто-нибудь может пролить свет на то, почему это происходит или как это исправить?
Когда значение по индексу 1 удаляется, а значение впоследствии устанавливается по индексу 0, несуществующее (неопределенное) значение по индексу 1теперь будет отображаться в цикле foreach.Я был в состоянии произвести этот результат только с индексами 1 и 0 (без каких-либо других n и n-1).
Запустите этот код:
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main():void
{
var bar : Array = new Array(6);
out(bar);
//proper behavior
trace("bar[1] = 1", bar[1] = 1);
out(bar);
//proper behavior
trace("delete bar[1]", delete bar[1]);
out(bar);
//proper behavior
trace("bar[4] = 4", bar[4] = 4);
out(bar);
//for each loop will now iterate over the undefined position at index 1
trace("bar[0] = 0", bar[0] = 0);
out(bar);
trace("bar[3] = 3", bar[3] = 3);
out(bar);
}
private function out(bar:Array):void
{
trace(bar);
for each(var i : * in bar)
{
trace(i);
}
}
}
}
Это даст такой вывод:
,,,,,
bar[1] = 1 1
,1,,,,
1
delete bar[1] true
,,,,,
bar[4] = 4 4
,,,,4,
4
bar[0] = 0 0
0,,,,4,
0
undefined
4
bar[3] = 3 3
0,,,3,4,
0
undefined
4
3
РЕДАКТИРОВАТЬ: см. Ответ для вероятной причины ошибки.Невозможно найти исправление.Мое решение состояло в том, чтобы кодировать особый случай, когда, если установлен индекс 0, а индекс 1 не существует, удалить индекс 1 после установки индекса 0. Не совсем элегантное решение: \