像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
var myArray = [];
像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
var myArray = [];
当前回答
当你初始化没有任何长度的数组时,没有区别。因此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
其他回答
为了更好地理解[]和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控制台。
我发现了这两种结构之间的一个区别,这让我很难受。
假设我有:
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()。
事情远比看上去的复杂。大多数其他答案是正确的,但也…
新数组(n)
允许引擎为n个元素重新分配空间 为创建数组而优化 创建的数组被标记为稀疏数组具有最少的性能数组操作,这是因为每个索引访问都必须检查边界,查看是否存在值并遍历原型链 如果数组被标记为稀疏,就没有办法返回(至少在V8中),它在生命周期内总是会变慢,即使你在1毫秒或2小时后用内容填充它(打包的数组)也没关系
[1, 2, 3] | | []
创建的数组被标记为已打包(除非使用delete或[1,,3]语法) 针对数组操作进行了优化(用于.., forEach, map等) 随着数组的增长,引擎需要重新分配空间
对于旧版本的浏览器可能不是这样。
在使用承诺时,我发现了一个不同。在使用承诺数组(例如arr,初始化为arr=[])时,在Promise.all(arr)中得到一个错误。而当声明为arr = 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会使依赖数组变得困难。用于计算的长度。