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

var myArray = new Array();

and

var myArray = [];

当前回答

使用隐式数组创建数组与使用数组构造函数创建数组之间的区别很微妙,但很重要。

创建数组时使用

var a = [];

您正在告诉解释器创建一个新的运行时数组。根本不需要额外的处理。完成了。

如果你使用:

var a = new Array();

你告诉解释器,我想调用构造函数Array并生成一个对象。然后它通过执行上下文查找要调用的构造函数,并调用它,创建数组。

你可能会想“嗯,这一点都不重要。它们是一样的!”不幸的是,你不能保证。

举个例子:

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

在上面的例子中,第一个调用将如您所期望的那样提醒“SPARTA”。第二个则不会。你最终会看到undefined。您还会注意到b包含所有原生Array对象函数,例如push,而另一个则不包含。

虽然您可能希望发生这种情况,但它只是说明了[]与new Array()不同的事实。

如果你只是想要一个数组,最好使用[]。我也不建议到处去重新定义Array…

其他回答

有区别,但在那个例子中没有区别。

使用更详细的方法:new Array()在参数中有一个额外的选项:如果你将一个数字传递给构造函数,你将得到一个该长度的数组:

x = new Array(5);
alert(x.length); // 5

为了演示创建数组的不同方法:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

另一个区别是,当使用new Array()时,您可以设置数组的大小,这会影响堆栈大小。如果你得到堆栈溢出(数组的性能。push vs array .unshift),当数组的大小超过堆栈的大小时,就会发生这种情况,并且必须重新创建。因此,根据用例,在使用new Array()时实际上可以提高性能,因为可以防止发生溢出。

正如在这个答案中指出的,new Array(5)实际上不会向数组中添加5个未定义的项。它只是为五个项目增加了空间。请注意,以这种方式使用Array会使依赖数组变得困难。用于计算的长度。

使用Array构造函数创建一个所需长度的新数组,并将每个下标填充为undefined,将赋值给变量one的数组创建您为其提供信息的下标。

我发现了这两种结构之间的一个区别,这让我很难受。

假设我有:

function MyClass(){
  this.property1=[];
  this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();

在现实生活中,如果我这样做:

MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');

我最后得出的结论是:

MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']

我不知道语言规范说应该发生什么,但如果我想让我的两个对象在我的对象中有唯一的属性数组,我必须使用new Array()。

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

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

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

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

使用的区别

var arr = new Array(size);

Or

arr = [];
arr.length = size;

在这个问题上已经讨论得够多了。

我想添加速度问题-目前最快的方式,在谷歌chrome是第二个。

但请注意,这些东西往往会随着更新而发生很大变化。此外,不同浏览器的运行时间也不同。

例如-我提到的第二个选项,在chrome上运行200万[ops/秒],但如果你在mozilla dev上尝试,你会得到一个惊人的更高的速度2300万。

无论如何,我建议你每隔一段时间在不同的浏览器(和机器)上检查一下,使用站点本身