20

I was just playing around with JavaScript and got stuck with a simple program.

I declared an array in JavaScript like

var a = [0, 1, 2];

Then as there is no fixed size for an array in JavaScript and we can add more to the array, I added another integer to array.

a[3] = 3;

And as expected If I try to access a[4] I am definitely going to get it as undefined.

Now, if I take an array

var a = [0,1,2];

And add another element

a[4] = 4;

I have intentionally not defined a[3], and this also gives me a[3] as undefined.

Here is a fiddle where this can be observed: http://jsfiddle.net/ZUrvM/

Now, if I try the same thing in Java,

int[] a = new int[4];
a[0] = 0;
a[1] = 1;

a[3] = 3;

Then I end up with

a[2] = 0;

You can see this on ideone: https://ideone.com/WKn6Rf

The reason for this in Java I found is that the four variables are defined while declaring the array and we can only assign values to the declared size of array. But in JavaScript when I declare an array of size 3 and then add 5th element why does it not consider the 4th element to be null or 0 if we have increased the array size beyond 4?

Why do I see this strange behavior in JavaScript, but not in other languages?

0

3 Answers 3

17

Why is this strange behavior in JavaScript?

Because arrays are only objects. If you access a nonexisting property, you get back undefined. You simply didn't assign an element at index 3, so there is nothing.

Auto-growing the array by assigning higher indices does not change this behaviour. It will affect the .length property, yes, but the intermediate indices will stay nonexistent. This is known as a sparse array.

Why is this strange behaviour in Java / C / C++?

Because arrays are chunks of allocated memory, and when allocating an array of size 4, all its elements take their values from that memory location. To avoid indeterminate values, in some languages/occasions the fields get default-initialised, typically with 0.

Sign up to request clarification or add additional context in comments.

5 Comments

Allocating an array, in C, does not automatically initialise it with 0.
Arrays are objects in Java as well. However they have a fixed size and all indexes are initialized to its default. The default for a numeric type is 0. A boolean defaults to false. An object defaults to null.
because ... in Javascript arrays are a collection of references and in Java arrays are a collection of values of the defined type (and initialized as such)
@Oxinabox: You're right, I've fixed that paragraph.
@Skaperen: Even Javascript, arrays are a (indexed) collection of values, not of references.
3

JavaScript isn't a strongly typed language.

In Java you declared an array of integers. The default value of any element in that array is 0.

In JavaScript, when you declare an array, the default value is undefined as it can hold anything, number, string, any object (including another array). All elements of a JavaScript array don't have to be the same type.

1 Comment

Javascript uses duck typing
3

An array is a continuous collection of data. Say if you have a value at index 1 and index 10, the rest will be filled by undefined.

You can't create an array with empty values. 'Empty in your sense', is not undefined or null, it's empty :)

That continuous data is undefined means default assignment in JavaScript.

Say if you defined a variable,

var X;
console.log(X)    //Undefined

it's not null. null is a user explicitly specifying a way to tell there is an empty data, and undefined is the JavaScript engine way.

13 Comments

that's what my question is if you have value at index 1 and index 10 why the rest don't get assigned why are they not defined yet if we already have defined 10th element the there should be continuous data from 1 to 10 at least a null assigned to each one.
In fact, no. The rest will not be filled with undefined values. Those properties don't exist, and even have a special display when logged. They only yield undefined when being accessed.
if not assigned values are defaultly set to undefined, this is javascript's behavior.
@NaeemShaikh27 that continuous allocated data reference is undefined
Again, no: There is no continous allocated data. Lets define an array of length 5 that is empty (not consisting of undefined values): var x = [,,,,,]; x.length == 5. Now lets check whether the index 2 exists in this array: "2" in x // false. Assign a value there: x[2] = undefined - and it exists: "2" in x // true!
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.