Будут ли эти числовые промежутки быть каким-то образом выделены (и, следовательно, взять некоторую память), даже если у них нет назначенных значений?
Нет. Массивы JavaScript на самом деле не являются массивами (см. Ниже), а неиспользуемые индексы не содержат памяти.
Когда я удалю myArray [456] из верхнего примера, будут ли перемещены элементы ниже этого элемента?
Если вы говорите об индексах массивов, это зависит от того, как вы его удаляете: если вы используете ключевое слово delete
, нет. Если вы используете функцию splice
или аналогичную, да. В терминах памяти нет, другие записи не перемещаются (независимо), и любая память, на которую ссылалась запись, которая больше не существует (из-за delete
или splice
или pop
или аналогичных) становится доступной для исправления сборщик мусора. Связанные списки практически не имеют преимущества в JavaScript над массивами или обычными старыми объектами, и вы редко их видите. Добавление к массиву JavaScript (или объекту), скорее всего, будет операцией с почти постоянным временем (реализациям, вероятно, потребуется сделать хэширование и, возможно, некоторый обход структур B-дерева или аналогичный, но это полностью зависит от реализации), так как это удаление.
Для того, что вы описываете, как указал Зевон, вам может не понадобиться массив. Вам действительно нужен массив, если вам нужно свойство length
или одна из функций массива, которая опирается на него. В противном случае вам будет лучше с обычным старым объектом:
var obj = {};
obj[123] = "foo";
obj[456] = "bar";
obj[789] = "baz";
Совершенно верно JavaScript. Значения, которые вы используете в скобках (123 и т. Д.), Принудительно привязываются к строкам (независимо от того, имеете ли вы дело с массивом или простым объектом), и поэтому ключ действительно «123» и т. Д. (Независимо от того, используя Array
или Object
). Вы можете даже прокручивать их, используя структуру управления for..in
(details here).
Что я подразумеваю под «... на самом деле не являются массивами»? Буквально это. Объектами JavaScript являются карты key-> value, а массивы JavaScript - не что иное, как объекты, которые имеют ключи и значения, и специальную обработку для ключей, которые являются числовыми строками, и специальное свойство length
. Хотя мы обычно записываем массивы «индексы» в виде чисел, как и все имена свойств, они относятся к . Строки — a[0]
преобразуется в a["0"]
(хотя реализации могут быть оптимизированы, если поведение остается в соответствии с спецификацией). Это предусмотрено статьей 15.4 the specification, который начинается с этим пунктом:
массив объекты особого обращения к определенному классу имен свойств. Имя свойства Р (в виде значения String) является индексом массива тогда и только тогда, когда ToString (ToUint32 (Р)) равна P и ToUint32 (P) не равно 2^32-1. Свойство, имя свойства которого является индексом массива, также называется элементом . Каждый объект Array имеет свойство length
, значение которого всегда является неотрицательным целым числом менее 2^32. Значение свойства length
численно больше имени каждого свойства, имя которого является индексом массива; всякий раз, когда создается или изменяется свойство объекта Array, другие свойства корректируются по мере необходимости для поддержания этого инварианта.В частности, всякий раз, когда добавляется свойство, чье имя является индексом массива, свойство length
изменяется, если необходимо, на одно больше, чем числовое значение этого индекса массива; и всякий раз, когда изменяется свойство length
, каждое свойство, имя которого является индексом массива, значение которого не меньше, чем длина нового , автоматически удаляется. Это ограничение применяется только к собственным свойствам объекта Array и не зависит от свойств индекса длины или массива, которые могут быть унаследованы от его прототипов.
не имеющий отношения к вашему вопросу, но при выполнении такого рода вещей вы можете использовать объект вместо var myArray = {} – Zevan