Array() 与 new Array()

IT技术 javascript arrays
2021-01-31 13:37:23

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

x = Array()

x = new Array()

我应该使用哪一种?

4个回答

规范说:

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

您应该使用文字[]. 此处概述原因使用Array()构造函数可能会有歧义,因为它接受一个length或一个元素列表:

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()给你。

在 ES5 中,为避免此问题,您可以使用Array.of:“Array.of(7) 创建一个具有单个元素 7 的数组,而 Array(7) 创建一个长度属性为 7 的空数组”
2021-03-17 13:37:23
实际上,new Array(5)[,,,,]
2021-04-09 13:37:23

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

x = []

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

@minitech - 为什么“应该”?
2021-03-24 13:37:23
没错,有完全一样的。
2021-03-27 13:37:23
mu 是完全正确的:当且仅当您正在做一些性能密集型的事情时使用arr = new Array(n)(wheren是一个数字),并且您提前知道数组的大小,因此所需的内存会一次性分配(原则上)。
2021-03-27 13:37:23
@TrevorBurnham - 没有理由相信设置长度属性会导致分配任何内存或提高性能。
2021-03-29 13:37:23
x = [ ]除非出于某种原因需要预先调整数组的大小,否则您可能应该同时使用JavaScript 和 CoffeeScript。
2021-04-08 13:37:23

一些值得一提的事实:

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]
大约对象文本部分[]是一样的Array,并new Array没有真正很害怕。在此处阅读更多信息:stackoverflow.com/questions/931872/...
2021-03-14 13:37:23
@azrahel 毫无疑问,性能可能会有所不同,但从技术上讲,每个人都做同样的事情。参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/... , developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
2021-03-23 13:37:23
不,您不会:) 只需阅读链接或文档。使用对象字面量[]需要一些捷径,并且在内部不会执行构造函数执行的某些代码。如果你不关心性能或其他边缘情况问题,当然,使用哪个。但是,如果您确实在意,则应该了解差异,因为存在一些差异。所以我所说的是“是”,在每种情况下你都会得到空数组,但“不”在结构上/内部不会相同。
2021-03-25 13:37:23
@azrahel 您将使用上述任何表达式(如果Array是本机)获得相同的空数组,请尝试:{a:new Array,b:new Array(),c:[]}
2021-04-02 13:37:23
@Melab 1% 是多少?
2021-04-05 13:37:23