Array()与new Array()的区别

128

两者(如果有的话)之间有什么区别?

x = Array()

并且

x = new Array()

我该使用哪一个?


2
你可能会觉得这个有趣:https://dev59.com/MHRC5IYBdhLWcg3wMd9S - nickd
4个回答

144

规范文档 表示:

当以函数形式而非构造函数形式调用 Array 时,会创建并初始化一个新的数组对象。因此,函数调用 Array(…) 等同于具有相同参数的对象创建表达式 new Array(…)


45

你应该使用字面量[]。原因在这里有详细说明。使用Array()构造函数可能会产生歧义,因为它可以接受length或元素列表两种参数:

new Array(5)   // [ , , , , ]
new Array('5') // ['5']

[5]   // [5]
['5'] // ['5']
你可以在不使用new运算符的情况下使用Array的原因是它在内部使用构造函数的一个常用技巧。
function Thing(){
    if (!(this instanceof Thing)){
        return new Thing()
    }
    // ... define object
}

也就是说,如果你调用Thing(),它将为你调用new Thing()


53
实际上,new Array(5) 会得到 [,,,,] - Stefan Octavian
3
在ES5中,为避免这个问题,你可以使用Array.of: "Array.of(7)创建一个只含有一个元素7的数组,而Array(7)创建一个长度属性为7的空数组"。 - Rsh

10

有些值得一提的事实:

Array === Array.prototype.constructor //true

new Array()new Array 以及 [] 都表示创建一个新的数组,意思相同。

然而,调用构造函数的结果并不一定等同于创建一个新的对象实例。例如:

Foo = function(){}

x = Foo()   // undefined
y = new Foo // {}

所以x和y可以是不同的。

但如果对象本身是一个数组,根据之前提到的定义,你将得到相同的结果。

x = Array()   // []
y = new Array // []

即使您传递一个整数(表示长度)
x = Array(3)     // [empty × 3]
y = new Array(3) // [empty × 3]

或者包含非整数值(表示内容)。
x = Array(true)     // [true]
y = new Array(true) // [true]

更多参数(告诉内容)
x = Array(1,2,3)     // [1,2,3]
y = new Array(1,2,3) // [1,2,3]

关于对象字面量[]Arraynew Array相同的说法是不正确的。您可以在此处阅读更多信息:https://dev59.com/BnNA5IYBdhLWcg3wgeOk - azrahel
@azrahel,如果Array是原生的话,使用上述任何表达式都会得到相同的空数组,请尝试使用{a:new Array,b:new Array(),c:[]} - Alex Szücs
不,你不需要只是阅读链接或文档。使用对象字面量[]会快捷一些,它在内部不执行构造函数中的某些代码。如果您不关心性能或其他边缘情况问题,那么可以随便使用哪个。但是如果您确实关心,就应该知道其中的区别,因为它们之间存在一些差异。所以我的意思是,是的,在每种情况下都会获得空数组,但是不,它们在结构/内部上并不相同。 - azrahel
@azrahel 毫无疑问,性能可能会有所不同,但从技术上讲,它们都可以完成相同的任务。参考链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Array_literals,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Using_object_initializers - Alex Szücs
Array === Array.prototype.constructor 的结果为 true,这在 99% 的 JavaScript 函数中都是无关紧要的。 - Melab
1
@Melab 1% 是什么? - Alex Szücs

9

我认为两种方法都是等效的。然而,在JavaScript中,你应该始终使用直接量语法:

x = []

根据我所拥有的浏览器测试结果,Array(1, 2, 3)new Array(1, 2, 3) 的结果相同,Array(15)new Array(15) 也是如此。或者只使用 new Array()


4
除非你有预先确定数组大小的需求,否则在 JavaScript 和 CoffeeScript 中都应该使用 x = [ ] - mu is too short
1
@minitech - 为什么要用“should”? - RobG
2
@TrevorBurnham - 没有理由相信设置长度属性会导致任何内存分配或提高性能。 - RobG
@RobG:我不太明白,但我会给两个可能的响应。1)在 JavaScript 中,new Array 仍然是有效的,你可以使用它,并且正如 TrevorBurnham 指出的那样,在某些情况下可能有好处(是的,在某些浏览器上是这样的)。2)[]更短,更清晰,在我看来 - 它指定了一个列表,语法在许多其他语言中也是相同的。new Array()感觉像new String()new Number(),这通常是错误的。 - Ry-
@minitech - 因为每当有人说你应该做某事时,你需要知道他们的标准,以便确定它是否适合你的情况。不使用数组构造函数的另一个原因是new Array(9)new Array(9, 10)的结果非常不同,可能出乎意料。 - RobG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接