声明JavaScript数组时,“Array()”和“”有什么区别?

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

var myArray = new Array(); 

 var myArray = []; 

有一个区别,但在这个例子中没有什么区别。

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

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

为了说明创build数组的不同方法:

 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 ; 

创build一个数组与隐式数组和数组构造函数之间的区别是微妙但重要的。

当你使用创build一个数组

 var a = []; 

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

如果你使用:

 var a = new Array(); 

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

你可能会想:“呃,这根本不重要,它们是一样的!” 不幸的是,你不能保证。

以下面的例子:

 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”。 第二个不会。 你最终会看到未定义的。 你还会注意到b包含了所有本地数组对象的function,比如push ,其他的则不行。

虽然您可能期望发生这种情况,但它只是说明[]new Array()

如果你知道你只是想要一个数组,最好只用[] 。 我也不build议四处走动,重新定义数组…

奇怪的是, new Array(size)比Chrome中的[]快了2倍,而在FF和IE中大致相同(通过创build和填充数组来测量)。 只有知道数组的大小时才重要。 如果您添加的项目数量超过您提供的数量,性能提升将会丢失。

有关更多信息,以下页面描述了为什么您永远不需要使用新的Array():

http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/

你永远不需要在JavaScript中使用新的Object()。 使用对象文字{}来代替。 同样,不要使用新的Array(),而是使用数组literal []。 JavaScript中的数组与Java中的数组完全不同,使用类似Java的语法会使您感到困惑。

不要使用新的数字,新的string或新的布尔值。 这些forms产生不必要的对象包装。 只需使用简单的文字。

另外检查注释 – 新的数组(长度)forms没有任何有用的目的(至less在今天的JavaScript的实现)。

有一个巨大的差异,没有人提到。

你可能会认为new Array(2)相当于[undefined, undefined]因为我们有

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

但它不是!

让我们试试map()

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

看到? 这不一样! 但为什么呢?

根据ES6规范22.1.1.2, Array(len)只创build一个length设置为len的新数组,并且只剩下一点。 因此新arrays中没有真正的元素。 而根据规范22.1.3.15,映射将首先检查HasProperty,但结果是数组没有:

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

这就是为什么你不能指望任何迭代函数与new Array(len)

BTW,Safari和Firefox对此有更好的expression:

 // 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 ] 

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

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

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

第二个让你能够创build不是空的数组:

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

为了更好地理解[]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上的Google Chrome控制台。

下面是一段JavaScript代码,它将validation这两个声明导致相同的types:

 var test1 = []; test1.push("value"); var test2 = new Array(); test2.push("value"); alert(typeof(test1) == typeof(test2)); 

从这个例子开始,我可以用更具体的方式来解释,这个例子是基于Fredrik的好例子。

 var test1 = []; test1.push("value"); test1.push("value2"); var test2 = new Array(); test2.push("value"); test2.push("value2"); alert(test1); alert(test2); alert(test1 == test2); alert(test1.value == test2.value); 

我只是给数组添加了另一个值,并提出了四个警报:第一个和第二个是给我们存储在每个数组中的值,以确保值。 他们会返回相同的! 现在尝试第三个,它返回false,这是因为

JS将test1视为具有数组数据types的VARIABLE,它将test2作为一个具有数组functionOBJECT对待,并且在这里几乎没有什么区别。

第一个区别是当我们调用test1的时候,它调用了一个没有想到的variables,它只是返回存储在这个variables中的值而不考虑它的数据types! 但是,当我们调用test2时,它会调用Array()函数,然后将它的“推”值存储在它的“Value”属性中,同样的情况发生在alert2时,它返回数组对象的“Value”属性。

所以当我们检查test1是否等于test2当然不会返回true,一个是函数,另一个是一个variables(带有一个数组types),即使它们具有相同的值!

为了确保这一点,尝试第四个警报,与.value添加到它; 它会返回true。 在这种情况下,我们告诉JS“忽略容器的types,无论是function还是variables,请比较存储在每个容器中的值,告诉我们你看到的是什么! 这正是发生的事情。

我希望我能清楚地说出背后的想法,并对我的坏英语感到抱歉。

第一个是默认的对象构造函数call.mostly用于dynamic值。

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

创build静态值时使用第二个数组

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

没有什么大的区别,他们基本上是做同样的事情,但是以不同的方式来做,但是请继续阅读W3C的这个声明:

 var cars = ["Saab", "Volvo","BMW"]; 

 var cars = new Array("Saab", "Volvo", "BMW"); 

上面的两个例子完全一样。 没有必要使用新的Array()。
为了简单,可读性和执行速度,使用第一个(数组文字方法)。

但是与此同时,使用new Array语法创build新arrays被认为是一种不好的做法:

避免新的Array()

没有必要使用JavaScript内置的数组构造函数new Array()。
用[]代替。
这两个不同的语句都创build一个名为points的新的空数组:

 var points = new Array(); // Bad var points = []; // Good 

这两个不同的语句都创build一个包含6个数字的新数组:

 var points = new Array(40, 100, 1, 5, 25, 10); // Bad var points = [40, 100, 1, 5, 25, 10]; // Good 

新的关键字只会使代码复杂化。 它也可以产生一些意想不到的结果:

 var points = new Array(40, 100); // Creates an array with two elements (40 and 100) 

如果我删除了其中一个元素呢?

 var points = new Array(40); // Creates an array with 40 undefined elements !!!!! 

所以基本上不被认为是最好的做法,也有一个小的区别,你可以像这样将长度传递给new Array(length) ,这也不是一个推荐的方法。

使用的区别

 var arr = new Array(size); 

要么

 arr = []; arr.length = size; 

在这个问题上已经有足够的讨论了。

我想添加速度问题 – 目前最快的方式, google chrome是第二个。

但要注意,这些东西往往会随着更新而改变。 而且不同浏览器的运行时间也会有所不同。

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

无论如何,我build议你每隔一段时间检查一次,在不同的浏览器(和机器)上,使用网站等

正如我所知,不同的是你可以find切片(或者Array的其他function),比如code1 ,而code2则表示你的Array和他的实例

代码1:

 [].slice; // find slice here var arr = new Array(); arr.slice // find slice here Array.prototype.slice // find slice here 

码2:

 [].__proto__ == Array.prototype; // true var arr = new Array(); arr.__proto__ == Array.prototype; // true 

结论:

因为你可以看到[]new Array()创build一个新的Array.And实例,他们都从Array.prototype

它们只是Array.so的不同实例,这就解释了为什么[] != []

🙂

我用一个奇怪的行为招致[]。

我们有模型“类”与字段初始化到一定的价值。 例如:

 require([ "dojo/_base/declare", "dijit/_WidgetBase", ], function(declare, parser, ready, _WidgetBase){ declare("MyWidget", [_WidgetBase], { field1: [], field2: "", function1: function(), function2: function() }); }); 

我发现当字段用[]初始化时,它将被所有Model对象共享。 对其中一个进行修改会影响其他所

这不会使用new Array()初始化它们。 对象( {} vs new Object() )的初始化相同

TBH我不确定它是否与我们使用的框架( Dojo )有关,

我发现两个build筑之间的一个区别让我很难。

假设我有:

 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()

使用Array构造函数创build一个所需长度的新数组,并使用undefined填充每个索引,将一个数组赋值给一个variables,从而创build您为其指定的索引。