Array()与新Array()


Answers:


96

规范说:

Array作为函数而不是构造函数调用时,它将创建并初始化一个新的Array对象。因此,函数调用Array(…)等效于new Array(…)具有相同参数的对象创建表达式。


29

您应该使用文字[]这里概述原因。使用Array()构造函数可能是模棱两可的,因为它可以接受alength或元素列表:

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

[5]   // [5]
['5'] // ['5']

您可以在Array没有new运算符的情况下使用的原因是,它在内部对构造函数有一个通用的技巧:

function Thing(){
    if (!(this instanceof Thing)){
        return new Thing()
    }
    // ... define object
}

也就是说,如果您致电Thing(),它将new Thing()为您致电。


34
实际上,new Array(5)[,,,,]
Stefan Octavian

7

我相信两者是等效的。但是,至少在JavaScript中,应始终使用文字语法:

x = []

但基于在我的浏览器的一些测试,Array(1, 2, 3)给出了相同的结果new Array(1, 2, 3),并与同Array(15)new Array(15)。或者只是简单new Array()


是的,完全一样。
雷诺斯

3
x = [ ]除非由于某种原因需要预先调整数组大小,否则您可能应该同时使用JavaScript和CoffeeScript。
亩太短了

mu完全正确:仅当您在执行性能密集型操作时才知道数组将有多大,因此使用arr = new Array(n)(在哪里n是数字),因此(原则上)一次分配所有必需的内存。
Trevor Burnham

@minitech-为什么“应该”?
RobG

1
@TrevorBurnham-没有理由相信设置length属性会导致分配任何内存或提高性能。
RobG

0

值得一提的一些事实:

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

new Array()new Array[]一样

但是,调用构造函数的结果不必等同于创建Object的新实例。例:

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]

恐怕关于对象字面量与非真实部分[]相同。在此处了解更多信息:stackoverflow.com/questions/931872/…–Arraynew Array
Azrahel

@azrahel,您将使用上述任何表达式(如果Array是本地表达式)得到相同的空数组,请尝试:{a:new Array,b:new Array(),c:[]}
AlexSzücs20年

不,您不会:)只是阅读链接或文档。使用对象字面量[]需要一些快捷方式,并且在内部不执行构造函数所执行的某些代码。如果您不关心性能或其他极端情况问题,请确保使用其中任何一种。如果您确实在乎,则应该了解差异,因为其中有些差异。所以说的是“是”,在每种情况下您都会得到空数组,但是“否”,它在结构/内部不会相同。
Azrahel

@azrahel毫无疑问,性能可能会有所不同,但是从技术上讲,每个功能都可以做相同的事情。参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
亚历Szücs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.