![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Aliance |
|
||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Интересует следующая вещь, если я имею массив вида:
будет ли этот код намного больше есть памяти, чем следующий:
|
||||
|
|||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 15 Всего: 315 |
имхо, да. уже не раз встречал ситуацию, когда развёртывание массива в котором были только элементы [2009] к примеру приводило к тому, что и все элементы от 0 тоже существуют
|
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Существуют - это одно, а вот нагружают ли они оперативку?
Один товарищ мне сказал, что нет. Фактически, это ассоциативный массив получается по его словам. Но подкрепить свои слова он не смог. И если все же нагрузка есть - какие альтернативы? |
|||
|
||||
| IDVsbruck |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 8 Всего: 22 |
При
длина массива a.length будет равна 2. А при
длина будет уже 1000000000000, при указании любого другого индекса выдаст undefined, то есть "промежуточные" элементы точно не создаются, также как для первого случая при задании a[10] выдаст тот же undefined. Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться (по крайней мере, очень несущественно - за счет индексов может быть расхождение). Но это точно не ассоциативный массив (которого, кстати, в js не существует - это простой Object) и занимает он точно другой объем. Правда, не могу сказать, в какую сторону, так как не исследовал, но Array и Object - примитывы, но в js все есть объект, следовательно, Array может расширять реализацию Object, что не может не отразиться на объеме. Другое дело, что хранение в памяти индексов точно разное: для массивов оно только численное (т.е. занимает "мало"), а для объектов (ассоциативных массивов) - литеральное, т.е. может занимать значительно больше. |
||||
|
|||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Нет, все это я понимаю и знаю.
Вопрос именно вот в чем:
поясни этот момент. То есть примитивы "undefined" и "не задан вовсе" - одно и то же в контексте выделяемой памяти? Просто мне почему-то кажется, что "undefined" - это все-таки есть некое объявление переменной (объявление в том, что переменная не существует). Я не прав? P.S.: разности в памяти под сами индексы, конечно же, в расчет не берем. |
|||
|
||||
| IDVsbruck |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 8 Всего: 22 |
Ага, разобрался. Вот выдержки из ECMA-262:
15.4 Объекты Array Объекты типа Array (массивы) специальным образом обрабатывают обращения к определённому классу имён свойств. Имя свойства P (в форме строкового значения) является индексом массива в том и только в том случае, когда ToString(ToUint32(P)) равняется P и ToUint32(P) не равняется 232 - 1. Каждый объект типа Array обладает свойством length, значение которого всегда равно неотрицательному целому, меньшему, чем 232 . Значение свойства length численно больше чем имя каждого свойства, являющегося индексом массива. Когда свойства объекта типа Array создаются или меняются, другие свойства по необходимости корректируются для поддержания этого соотношения. ... 15.4.1 Вызов конструктора Array как функции Когда Array вызывается не как конструктор, а как функция, он создаёт и инициализирует новый объект типа Array. Таким образом, вызов функции Array(...) эквивалентен выражению создания объекта new Array(...), вызванному с теми же аргументами. ... 15.4.2.2 new Array(len) ... Если аргумент len имеет тип Number и ToUint32(len) равно len, то свойство length создаваемого объекта устанавливается в ToUint32(len). Если аргумент len имеет тип Number и ToUint32(len) не равняется len - бросается исключение RangeError. То есть на хранения индекса, будь то 0 или 999999999999, все равно выделяется 4 байта (2^32), а индекс - только указатель. Следовательно, оба варианта будут занимать в памяти совершенного одинаковый объем. |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Отлично, спасибо
|
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |