Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing Array beyond its size in javascript

I read in a particular book that an array in JavaScript can hold 4,294,967,295 items and would throw exception if the number reaches beyond that. I tried out the functionality using the following code:

var a = ["a","b","c"];
a[4294967300] = "d";
console.log(a[4294967300]);

It shows the output "d" and no exception or error. Am I missing something here? Can someone put some light on the topic and share some knowledge regarding max array items in JavaScript and various scenarios related to it?

like image 480
tejas_spy007 Avatar asked May 26 '14 09:05

tejas_spy007


People also ask

What will happen if we access element beyond the size of an array?

Accessing array elements greater than its size If you try to access the array position (index) greater than its size, the program gets compiled successfully but, at the time of execution it generates an ArrayIndexOutOfBoundsException exception.

What is the maximum size of an array in JavaScript?

JavaScript arrays are zero-based and use 32-bit indexes: the index of the first element is 0, and the highest possible index is 4294967294 (232−2), for a maximum array size of 4,294,967,295 elements.

How do you expand an array in JavaScript?

To extend an existing array in JavaScript, use the Array. concat() method.

Does JavaScript have index out of bounds?

JavaScript does not throw an error if you set an out of bounds array index. For example, if your array has length 3 and you set index 4 , JavaScript will just grow your array by adding a hole in the array.


2 Answers

An array doesn't have to hold all the items from 0 to N to contain one with index N.

That's because arrays in JavaScript engines can switch to a dictionnary mode when the holes are too big, those arrays are called sparse arrays (vs dense arrays).

It's important to know this distinction because the implementation is leaking on one point : performance. You should read this on this topic : http://www.html5rocks.com/en/tutorials/speed/v8/

But regarding indexes starting at 2³², sebcap26 is right, there's a distinction due to the fact the index is handled as a string. This distinction is important and can be verified by logging a.length : you'll see the length isn't impacted by such an element. There's no exception or error per se but it makes it impossible to use normal array operations like iterating up to the length or using array functions like map or filter (the elements with index greater than the numeric index limit are ignored by those functions).

like image 75
Denys Séguret Avatar answered Sep 30 '22 16:09

Denys Séguret


If I understand well the ECMAScript specifications, an index which is not in [0 .. 2^32-1] is converted into a String and used as an Object key, not as an Array index.

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.

like image 36
Sebastien C. Avatar answered Sep 30 '22 14:09

Sebastien C.