简体   繁体   中英

Are JavaScript arrays associative?

For instance, if I do a[1000000]=1; will it use memory for 1000000 elements or just for this one?

In the ECMAScript standard (§15.4), the only special thing about array is that the length property is automatically updated (and a bunch of Array-specific prototype functions):

Array objects give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32( P )) is equal to P and ToUint32( P ) is not equal to 2 32 −1.
...
Every Array object has a length property whose value is always a nonnegative integer less than 2 32 . The value of the length property is numerically greater than the name of every property whose name is an array index; ...

Other than that, an Array is just an Object, which means it can be treated as an associative array, although you shouldn't .


Nowadays the JS engines should detect whether the array is dense or very sparse and switch between using a linear or associative array internally. In your case, the JS engine won't allocate a million elements.

Would 1,000,000 elements be created?

No, arrays are sparse, but their index will be persistent. EDIT: Actually, their sparseness would be implementation-specific, but keeping them sparse in case of a[1000000] = 1 would seem a logical thing to me.

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

Are JS arrays associative?

JavaScript arrays are a subset of associative arrays (in that indices have to be integers, as shown in KennyTM's answer . JavaScript objects are fully associative:

var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"

You may use object literal as a kind of 'associative aray' in some cases:

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

But it has its limitations... There is no magic 'length' parameter and you will not have access to methods that every array has.

JS arrays are auto-growing. Setting a[100] to 1 on an empty array will populate the first 99 elements with "undefined".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM