|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2009
Сообщений: 8
|
Парадокс! при удалении свойств в цикле for in
Наткнулся тут на забавную особенность for in. Объясните пожалуйста данное явление.
Есть простой массив с цифровыми ключами. Гипотетически допустим необходимо пробежаться по свойствам данного массива и удалить все элементы поочереди. (Способ конечно кривой, но всеже) Делам следующее: Если ключи массива идут подляд 012345678... то все прекрасно удаляется, но в случае если (как показали эксперименты): 1. числовые ключи в массиве с пропусками 2. в массиве присутствует значение с ключом 0 ноль 3. при определенном количестве элементов в массиве for in при пробегании свойств массива и удалении, игнорирует ключи кратные 8... 8 16 32 итд и не удаляет их. пример ... ------- массив --------------------- var a:Array = new Array(); a[0]='a0'; a[8]='a8'; a[9]='a9'; a[10]='a10'; a[11]='a11'; a[12]='a12'; a[13]='a13'; ------------trace порядок удаления---------------- a[0]=a0 a[9]=a9 a[10]=a10 a[11]=a11 a[12]=a12 a[13]=a13 ------- не удалилось --------------------- a[8]=a8 ------- массив --------------------- a[0]='a0' a[1]='a1' a[16]='a16' a[17]='a16' a[8]='a8' a[9]='a9' a[10]='a10' a[11]='a11' a[12]='a12' a[13]='a13' a[14]='a14' a[15]='a15' ------------trace порядок удаления---------------- a[0]=a0 a[17]=a16 a[1]=a1 a[8]=a8 a[9]=a9 a[10]=a10 a[11]=a11 a[12]=a12 a[13]=a13 a[14]=a14 a[15]=a15 ------- не удалилось --------------------- a[16]=a16 Последний раз редактировалось QuanChi; 15.02.2011 в 22:21. |
|
|||||
Регистрация: Sep 2009
Сообщений: 8
|
ну тут опираться на размер вообще не было возможности... размер массива выставляется по максимальному ключу.. а реального количества значений не показывает и конечно не изменяется при удалении элементов.
ну обычным циклом самому перебирать ключи можно, наматывая лишние циклы на несуществующих ключах. Но ключи могут идти не подряд и вообще отсутствовать. |
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Да, забавно. Перебирает все, а удаляет не все.
Присваивайте null каждому элементу, или просто новый экземпляр Array создавайте. |
|
|||||
В связи с повторением темы
http://www.flasher.ru/forum/showthread.php?t=149318 хочу снова спросить: "НЕ на массиве, а на объекте удалось добиться такой лажи?" |
|
|||||
Регистрация: Sep 2009
Сообщений: 8
|
Прошу прощения за повторение, по поиску не нашел... с Объектом подобных казусов очевидно не происходит. Видимо бага где-то в глубине методов объекта Array.
|
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Цитата:
|
|
|||||
Вот еще интересная штука
var o:Object = { b: "1", c: "2" } for (var name:String in o) { o["a"] = "3"; trace(name, o[name]); // b 1, c 2 } trace(o["a"]); // 3 var o:Object = { a: "3", c: "2" } for (var name:String in o) { o["b"] = "1"; trace(name, o[name]); // a 3, b 1, c 2 } trace(o["b"]); // 1 Смысл в том, что цикл for .. in, судя по всему, обходит свойства в алфавитном порядке. При этом (как видно из первого случая) если мы сейчас на свойстве "b", это точно значит, что свойство "а" мы уже прошли (хотя, опять же, как видно из примера - вовсе не значит)
__________________
...вселенская грусть |
|
|||||
Цитата:
Цитата:
Вообще говоря, что обход объекта с помощью for in НЕ поломается при удалении элементов в этом for in тоже никто НЕ обещал. Но работает. Последний раз редактировалось expl; 16.02.2011 в 02:04. |
Часовой пояс GMT +4, время: 12:48. |
|
« Предыдущая тема | Следующая тема » |
|
|