协慌网

登录 贡献 社区

在声明 JavaScript 数组时,“Array()”和 “[]” 之间有什么区别?

声明这样的数组之间的真正区别是什么:

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

;

使用隐式数组和数组构造函数创建数组之间的区别很微妙但很重要。

使用时创建数组

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 ,而另一个则不包含push

虽然您可能期望这种情况发生,但它只是说明了[]new Array()的事实。

如果你知道你只想要一个数组,那么最好只使用[] 。我也不建议四处走动并重新定义 Array ...

没有人提到,存在巨大差异。

您可能认为new Array(2)之前等同于[undefined, undefined] ,因为我们有

new Array(2).length           // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true

但它不是!

我们来试试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)创建的new Array(len)

BTW,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 ]

我已经向 Chrome 提交了一个问题,要求他们修复这个令人困惑的日志: https//bugs.chromium.org/p/chromium/issues/detail?id = 732021

更新:它已经修好了。 Chrome 现在登录为

new Array(2)             // (2) [empty × 2]