Действительно ли массивы JavaScript ассоциативны?

Например, если я делаю [1000000] =1; это будет использовать память для 1 000 000 элементов или только для этого?

6
задан Lem0n 4 April 2010 в 20:48
поделиться

4 ответа

Будет ли создано 1 000 000 элементов?

Нет, массивы разреженные, но их индекс будет постоянным. РЕДАКТИРОВАТЬ: На самом деле их разреженность зависит от реализации, но сохранение разреженности в случае a [1000000] = 1 мне кажется логичным.

var a = [1, 2, 3, 4];
var x = a[1]; // -> x := 2

delete a[1];
var y = a[1]; // -> y := undefined

a[9] = 10;
var y = a[8]; // -> z := undefined

Ассоциативны ли массивы JS?

Массивы JavaScript являются подмножеством ассоциативных массивов (в которых индексы должны быть целыми числами, как показано в ответе Кенни . Объекты JavaScript полностью ассоциативны:

var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
7
ответ дан 8 December 2019 в 14:41
поделиться

Массивы JS растут автоматически. Установка [100] на 1 в пустом массиве заполнит первые 99 элементов значением «undefined».

0
ответ дан 8 December 2019 в 14:41
поделиться

В стандарте ECMAScript (§15.4) единственная особенность массива заключается в том, что свойство length автоматически обновляется (и множество функций прототипа, специфичных для массива):

Объекты массива дают особый подход к определенному классу имен свойств. Имя свойства P (в форме значения String) является индексом массива тогда и только тогда, когда ToString (ToUint32 ( P )) равно P и ToUint32 ( P ) не равно 2 32 -1.
...
Каждый объект Array имеет свойство length , значение которого всегда является неотрицательным целым числом меньше 2 32 . Значение свойства length численно больше, чем имя каждого свойства, имя которого является индексом массива; ...

В остальном массив - это просто объект, что означает, что его можно рассматривать как ассоциативный массив, , хотя вы не должны .


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

8
ответ дан 8 December 2019 в 14:41
поделиться

В некоторых случаях вы можете использовать литерал объекта как своего рода «ассоциативный массив»:

var object = {
  "first": "1",
  "second": "2",
  "third": "3",
  "fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";

Но у него есть свои ограничения ... Есть нет магического параметра длины, и у вас не будет доступа к методам, которые есть в каждом массиве.

1
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: