Array() vs new Array()
Asked Answered
E

3

130

What is the difference (if there is any) between

x = Array()

and

x = new Array()

Which one should I use?

Ekaterinoslav answered 20/11, 2011 at 23:32 Comment(1)
You might find this interesting: stackoverflow.com/questions/383402/…Hopefully
L
147

The spec says:

When Array is called as a function rather than as a constructor, it creates and initialises a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments.

Longicorn answered 20/11, 2011 at 23:36 Comment(0)
S
46

You should use the literal []. Reasons are outlined here. Using the Array() constructor can be ambiguous, since it accepts either a length or a list of elements:

new Array(5)   // [ , , , , ]
new Array('5') // ['5']

[5]   // [5]
['5'] // ['5']

The reason you can use Array without the new operator is that internally it does a common trick with constructors:

function Thing(){
    if (!(this instanceof Thing)){
        return new Thing()
    }
    // ... define object
}

That is, if you call Thing() it will call new Thing() for you.

Sinfonietta answered 21/11, 2011 at 2:15 Comment(2)
Actually, new Array(5) gives [,,,,]Daugavpils
In ES5, To avoid this issue, you can use Array.of: "Array.of(7) creates an array with a single element, 7, whereas Array(7) creates an empty array with a length property of 7"Complainant
L
11

Some facts that worth to mention:

Array === Array.prototype.constructor //true

and

new Array() does the same as new Array and [] as well

However, the result of calling a constructor is not necessarily equivalent to creating a new instance of an object. Example:

Foo = function(){}

x = Foo()   // undefined
y = new Foo // {}

So x and y can be different.

But if the Object itself is an Array you will get the same by definition, as mentioned earlier.

x = Array()   // []
y = new Array // []

Even if you pass one integer (telling the length)

x = Array(3)     // [empty × 3]
y = new Array(3) // [empty × 3]

or one non integer (telling the content)

x = Array(true)     // [true]
y = new Array(true) // [true]

or more parameters (telling the content)

x = Array(1,2,3)     // [1,2,3]
y = new Array(1,2,3) // [1,2,3]
Liebig answered 28/9, 2020 at 15:33 Comment(6)
that part about object literal [] being the same as Array and new Array is not true am afraid. Read more here: stackoverflow.com/questions/931872/…Talkathon
@Talkathon you will get the same empty array using any of above expression (if Array is native), try: {a:new Array,b:new Array(),c:[]}Uncommonly
no you will not :) just read the link or documentation. Using object literal [] takes some shortcuts and internally does not execute some code that constructor does. If you don't care about performance or other edge case issues, sure, use whichever. If you do care though, you should know about differences, cause there are some. So what am saying is 'yes' you will get empty array in each case, but 'no' it s not going to be the same structurally/internally.Talkathon
@Talkathon It's no doubt that performance may differ, but technically each do the same thing. Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…Uncommonly
That Array === Array.prototype.constructor evaluates to true is completely uninteresting and holds for 99% of all JavaScript functions.Loriloria
@Loriloria what is the 1 %?Uncommonly

© 2022 - 2024 — McMap. All rights reserved.