存在差异,但该示例没有区别。
使用更详细的方法: 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]