![]() |
Парадокс! при удалении свойств в цикле for in
Наткнулся тут на забавную особенность for in. Объясните пожалуйста данное явление.
Есть простой массив с цифровыми ключами. Гипотетически допустим необходимо пробежаться по свойствам данного массива и удалить все элементы поочереди. (Способ конечно кривой, но всеже) Делам следующее: Код AS3:
в случае если (как показали эксперименты): 1. числовые ключи в массиве с пропусками 2. в массиве присутствует значение с ключом 0 ноль 3. при определенном количестве элементов в массиве for in при пробегании свойств массива и удалении, игнорирует ключи кратные 8... 8 16 32 итд и не удаляет их. пример ... Код:
------- массив ---------------------Код:
------- массив --------------------- |
а обычным массивом все корректно удаляется? массив не уменьшает размер?
|
ну тут опираться на размер вообще не было возможности... размер массива выставляется по максимальному ключу.. а реального количества значений не показывает и конечно не изменяется при удалении элементов.
ну обычным циклом самому перебирать ключи можно, наматывая лишние циклы на несуществующих ключах. Но ключи могут идти не подряд и вообще отсутствовать. |
Да, забавно. Перебирает все, а удаляет не все.
Присваивайте null каждому элементу, или просто новый экземпляр Array создавайте. |
В связи с повторением темы
http://www.flasher.ru/forum/showthread.php?t=149318 хочу снова спросить: "НЕ на массиве, а на объекте удалось добиться такой лажи?" |
Прошу прощения за повторение, по поиску не нашел... с Объектом подобных казусов очевидно не происходит. Видимо бага где-то в глубине методов объекта Array.
|
Цитата:
|
Да, странно получается.... Наверно для таких целей лучше использовать просто цикл for, а не for in.
|
Вот еще интересная штука
Код AS3:
Код AS3:
Смысл в том, что цикл for .. in, судя по всему, обходит свойства в алфавитном порядке. При этом (как видно из первого случая) если мы сейчас на свойстве "b", это точно значит, что свойство "а" мы уже прошли (хотя, опять же, как видно из примера - вовсе не значит) |
Цитата:
Цитата:
Вообще говоря, что обход объекта с помощью for in НЕ поломается при удалении элементов в этом for in тоже никто НЕ обещал. Но работает. |
| Часовой пояс GMT +4, время: 19:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.