像这样声明一个数组的真正区别是什么:

var myArray = new Array();

and

var myArray = [];

当前回答

为了更好地理解[]和new Array():

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

以上结果来自Windows 7上的谷歌Chrome控制台。

其他回答

第一个是默认的对象构造函数调用。你可以使用它的参数。

var array = new Array(5); //initialize with default length 5

第二个函数让你能够创建非空数组:

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.

第一个是默认的对象构造函数调用。主要用于动态值。

var array = new Array(length); //initialize with default length

第二个数组用于创建静态值

var array = [red, green, blue, yellow, white]; // this array will contain values.

有一个重要的区别,目前还没有答案提到。

从这个:

new Array(2).length           // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true

你可能认为新的Array(2)等同于[undefined, undefined],但事实并非如此!

让我们尝试使用map():

[undefined, undefined].map(e => 1)  // [1, 1]
new Array(2).map(e => 1)            // "(2) [undefined × 2]" in Chrome

看到了吗?语义完全不同!为什么呢?

根据ES6 Spec 22.1.1.2, Array(len)的任务只是创建一个新数组,其属性长度设置为参数len,这就意味着在这个新创建的数组中没有任何实际元素。

函数map(),根据规范22.1.3.15将首先检查HasProperty然后调用回调,但结果是:

new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true

这就是为什么你不能期望任何迭代函数像往常一样在new Array(len)创建的数组上工作。

顺便说一句,Safari和Firefox在这种情况下有更好的“打印”:

// Safari
new Array(2)             // [](2)
new Array(2).map(e => 1) // [](2) 
[undefined, undefined]   // [undefined, undefined] (2) 

// Firefox
new Array(2)             // Array [ <2 empty slots> ]
new Array(2).map(e => 1) // Array [ <2 empty slots> ]
[undefined, undefined]   // Array [ undefined, undefined ]

我已经向Chromium提交了一个问题,并要求他们修复这个令人困惑的打印: https://bugs.chromium.org/p/chromium/issues/detail?id=732021

更新:已经修复了。Chrome现在打印为:

new Array(2)             // (2) [empty × 2]

当你初始化没有任何长度的数组时,没有区别。因此var a = [] & var b = new Array()是相同的。

但是如果你初始化数组的长度像var b = new array(1);,它将数组对象的长度设置为1。所以它等价于var b = [];b.length = 1;。

当你使用array_object时,这就会有问题。按下,它在最后一个元素后添加项目并增加长度。

var b = new Array(1);
b.push("hello world");
console.log(b.length); // print 2

vs

var v = [];
a.push("hello world");
console.log(b.length); // print 1

在使用承诺时,我发现了一个不同。在使用承诺数组(例如arr,初始化为arr=[])时,在Promise.all(arr)中得到一个错误。而当声明为arr = Array()时,没有得到编译问题。希望这能有所帮助。