135

What is the difference (if there is any) between

x = Array()

and

x = new Array()

Which one should I use?

j08691
209k33 gold badges269 silver badges281 bronze badges
asked Nov 20, 2011 at 23:32
1

3 Answers 3

150

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.

Itay Maman
30.8k12 gold badges93 silver badges124 bronze badges
answered Nov 20, 2011 at 23:36
Sign up to request clarification or add additional context in comments.

Comments

47

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.

answered Nov 21, 2011 at 2:15

2 Comments

Actually, new Array(5) gives [,,,,]
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"
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]
answered Sep 28, 2020 at 15:33

6 Comments

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/…
@azrahel you will get the same empty array using any of above expression (if Array is native), try: {a:new Array,b:new Array(),c:[]}
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.
@azrahel 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/…
@Melab what is the 1 %?
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.