声明数组的这两种方式之间的真正区别是什么:
var myArray = new Array();
以及
var myArray = [];
声明数组的这两种方式之间的真正区别是什么:
var myArray = new Array();
以及
var myArray = [];
这两者有所不同,但在这个例子中没有区别。
使用更冗长的方式: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()
时,您可以设置数组的大小,这会影响堆栈大小。如果您遇到堆栈溢出(Array.push与Array.unshift的性能比较),这可能很有用,当数组的大小超过堆栈大小时会发生堆栈溢出并且必须重新创建。因此,在某些情况下,使用new Array()
实际上可以提高性能,因为您可以防止溢出发生。
正如这个答案所指出的那样,new Array(5)
实际上不会向数组添加五个undefined
项,而只是为五个项添加空间。请注意,以这种方式使用Array
将使依靠array.length
进行计算变得困难。
使用隐式数组和使用数组构造函数创建数组之间的区别微妙但很重要。
当您使用:
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”。第二次不会。你最终会看到未定义。你还会注意到b包含所有的原生Array对象函数,如push
,而另一个则没有。[]
与new Array()
并不相同。[]
。我也不建议四处重新定义Array...还有一个重要的区别,没有任何答案提到过。
来自这个:
new Array(2).length // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true
你可能认为new Array(2)
等同于[undefined, undefined]
,但实际上并不是这样。
我们可以用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)
的作用只是创建一个新的数组,其属性length
设置为参数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]
[...Array(2)]
,它从结果的角度来看等价于 [undefined, undefined]
。 - Roberto Andradeundefined
。 - Huxnew Array(2)
的等价应该是 [,,]
,而不是 [undefined, undefined]
,对吧? - angleKH有趣的是,在Chrome浏览器中,new Array(size)
创建数组的速度几乎比[]
快2倍,在FF和IE中则差不多(通过创建和填充数组来衡量)。这只有在您知道数组的大致大小时才会有所影响。如果添加的项比您给定的长度还多,则性能提升就会丢失。
更准确地说:Array()
是一个快速的常量时间操作,不需要分配内存,而[]
是一种线性时间操作,设置类型和值。
new Array(length)
,而在size > ~1000时则使用[]
。 - glukki若需要了解更多信息,请参阅该页面,它解释了为什么您永远不需要使用new Array()
。
在JavaScript中您永远不需要使用
new Object()
。直接使用对象字面量{}
即可。同样地,不要使用new Array()
,可以用数组字面量[]
代替。在JavaScript中,数组的工作方式与Java中的数组完全不同,使用类似Java的语法会让您感到困惑。不要使用
new Number
、new String
或new Boolean
。这些形式会产生不必要的对象包装器。只需使用简单的字面量即可。
同时,请查看评论 - new Array(length)
的形式在今天的JavaScript实现中没有任何有用的目的。
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 = [5]
,但不能使用构造函数,因为 var array = Array(5)
会创建一个有5个空元素的空数组。 - cdmckay[1,2,3,4,5]
几乎和 new Array(5)
一样快,而后者只是在准备存储空间... 在 http://jsperf.com/array-instanciation/2 上查看测试用例并阅读测试用例,在抱怨之前请注意,下半部分与上半部分的测试不是在做同样的事情,最后三个测试用例还有值赋值。 - Sampo Sarrala - codidact.org[]
和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
Array(3)
或new Array(3)
与[3]
不同。 - ggorlenvar 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);
[]
和 new Array()
是相同的;在这两种情况下,.value
都将是 undefined
,并且对它们进行比较总是会返回 false。 - sliktsarray.value
根本不存在,而且typeof []
和typeof new Array()
都返回object
。这就是为什么有一个名为Array.isArray
的函数的原因之一。 - gman这其中的细节远不止表面看起来的那么简单。大多数其他答案是正确的 但同时..
new Array(n)
n
个元素[1, 2, 3] || []
delete
或[1,,3]
语法)for ..
、forEach
、map
等)这可能不适用于旧版浏览器/浏览器。
当您初始化没有任何长度的数组时并没有任何区别。所以var a = []
和var b = new Array()
是一样的。
但是,如果你像这样初始化长度 var b = new Array(1);
,它将设置数组对象的长度为1。因此,它等同于var b = []; b.length=1;
。
每当你使用array_object.push
时,这将会成为问题,它会在最后一个元素之后添加项目并增加长度。
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
[]
token:ARRAY_INIT
;new Array
tokens:NEW, IDENTIFIER
;new Array()
tokens:NEW, IDENTIFIER, CALL
- noobninja