声明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作为一个具有数组function的OBJECT对待,并且在这里几乎没有什么区别。
第一个区别是当我们调用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您为其指定的索引。