Являются ли массивы JavaScript ассоциативными? - PullRequest
6 голосов
/ 05 апреля 2010

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

Ответы [ 4 ]

8 голосов
/ 05 апреля 2010

В стандарте ECMAScript (& sect; 15.4) единственная особенность массива - это то, что свойство length автоматически обновляется (и набор функций-прототипов, специфичных для массива):

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

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


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

7 голосов
/ 05 апреля 2010

Будет ли создано 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 являются подмножеством ассоциативных массивов (в этом случае индексы должны быть целыми числами, как показано в ответе KennyTM . Объекты JavaScript полностью ассоциативны:

var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
1 голос
/ 05 апреля 2010

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

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

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

0 голосов
/ 05 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...