Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   массивы с пустотами (https://javascript.ru/forum/misc/44858-massivy-s-pustotami.html)

tsigel 04.02.2014 18:49

массивы с пустотами
 
Несколько вопросов про массивы.

1) Если я пишу:

var arr = [];
arr[1000] = 12;


Массив arr будет занимать место в памяти как массив с 1 элементом или он резервирует в памяти места под предыдущие элементы?

2) Перебор "дырявых" массивов.
Как лучше перебирать такие массивы, через "i in arr" или с помощью "forEach" будет лучше?

Пользоваться объектом в данном месте не удобно, так как массив будет не всегда дырявым и может быть очень большим. Вроде скорость работы с массивом много выше чем с объектом (но скорость через "i in arr" может быть та же что и у перебора объекта?)

Maxmaxmaximus7 04.02.2014 19:09

1) будет занмиать как 1, ничего не резервируется, просто при обращении к ячейке, движок посмотрит что такого ключа у обьекта нет, и вернет undefined

2)
Цитата:

Сообщение от tsigel
Как лучше перебирать такие массивы

дырявых массивов не существует, массив это непрерывный паравозик с данными, просто абстрактно подразумевается что данные в вагончиках у тебя undefinet в каждом лежит, по этому перебирание таких массивов ни чем не отличается от перебирания обычных массивов. ты перебираешь массив и если значение тебя не устраивает то просто переходишь к следующему элементу массива, так что разницы между for и forEach нет


Цитата:

Сообщение от tsigel
но скорость через "i in arr" может быть та же что и у перебора объекта?

критична ли тебе скорость и что мешает замерить? совершенно не нужно делать скорость так где она не критична, во преки распространенному мнению новичков.

tsigel 04.02.2014 22:57

ну к сожалению в данном случае она как раз вполне критична.

Кстати я проверял что "forEach" проходит только по тем элементам, которые "есть". Например:

var arr = [];

arr[10] = 1; arr[20] = 2; arr[100] = 10;

arr.forEach(function (arrElem, index) {

   alert(index);

});

Maxmaxmaximus7 04.02.2014 23:37

tsigel, оу, не знал, ну тогда используй его чо) по скорости, не смотря на то что это вызов функции, она не уступает for у, так как нативная и оптимизированная.


Часовой пояс GMT +3, время: 02:24.