Например, если я делаю [1000000] =1; это будет использовать память для 1 000 000 элементов или только для этого?
Будет ли создано 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"
Массивы JS растут автоматически. Установка [100] на 1 в пустом массиве заполнит первые 99 элементов значением «undefined».
В стандарте ECMAScript (§15.4) единственная особенность массива заключается в том, что свойство length
автоматически обновляется (и множество функций прототипа, специфичных для массива):
Объекты массива дают особый подход к определенному классу имен свойств. Имя свойства P (в форме значения String) является индексом массива тогда и только тогда, когда
ToString (ToUint32 (
P))
равно P иToUint32 (
P)
не равно 2 32 -1.
...
Каждый объект Array имеет свойствоlength
, значение которого всегда является неотрицательным целым числом меньше 2 32 . Значение свойстваlength
численно больше, чем имя каждого свойства, имя которого является индексом массива; ...
В остальном массив - это просто объект, что означает, что его можно рассматривать как ассоциативный массив, , хотя вы не должны .
В настоящее время движки JS должны определять, является ли массив плотным или очень разреженным, и переключаться между использованием линейного или ассоциативного массива внутри. В вашем случае движок JS не выделит миллион элементов.
В некоторых случаях вы можете использовать литерал объекта как своего рода «ассоциативный массив»:
var object = {
"first": "1",
"second": "2",
"third": "3",
"fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";
Но у него есть свои ограничения ... Есть нет магического параметра длины, и у вас не будет доступа к методам, которые есть в каждом массиве.