像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
var myArray = [];
像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
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
;
另一个区别是,当使用new Array()时,您可以设置数组的大小,这会影响堆栈大小。如果你得到堆栈溢出(数组的性能。push vs array .unshift),当数组的大小超过堆栈的大小时,就会发生这种情况,并且必须重新创建。因此,根据用例,在使用new Array()时实际上可以提高性能,因为可以防止发生溢出。
正如在这个答案中指出的,new Array(5)实际上不会向数组中添加5个未定义的项。它只是为五个项目增加了空间。请注意,以这种方式使用Array会使依赖数组变得困难。用于计算的长度。
其他回答
有关更多信息,下面的页面描述了为什么永远不需要使用new Array()
你永远不需要使用new Object()在 JavaScript。使用对象文字{} 代替。同样,不要使用new Array(), 使用数组文字[] 代替。JavaScript中的数组可以工作 不像Java中的数组,而且 使用类似java的语法 迷惑你。 不使用新数字,新字符串,或 新布尔。这些形式产生 不必要的对象包装。只使用 而是简单的字面量。
还要查看注释——新的Array(length)表单没有任何有用的用途(至少在今天的JavaScript实现中)。
有一个重要的区别,目前还没有答案提到。
从这个:
new Array(2).length // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true
你可能认为新的Array(2)等同于[undefined, undefined],但事实并非如此!
让我们尝试使用map():
[undefined, undefined].map(e => 1) // [1, 1]
new Array(2).map(e => 1) // "(2) [undefined × 2]" in Chrome
看到了吗?语义完全不同!为什么呢?
根据ES6 Spec 22.1.1.2, Array(len)的任务只是创建一个新数组,其属性长度设置为参数len,这就意味着在这个新创建的数组中没有任何实际元素。
函数map(),根据规范22.1.3.15将首先检查HasProperty然后调用回调,但结果是:
new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true
这就是为什么你不能期望任何迭代函数像往常一样在new Array(len)创建的数组上工作。
顺便说一句,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 ]
我已经向Chromium提交了一个问题,并要求他们修复这个令人困惑的打印: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
更新:已经修复了。Chrome现在打印为:
new Array(2) // (2) [empty × 2]
没有太大的区别,它们基本上做同样的事情,但以不同的方式来做,但是继续读下去,看看W3C的这个声明:
var cars = ["Saab", "Volvo","BMW"];
and
var cars = new Array("Saab", "Volvo", "BMW");
上面的两个例子完全相同。没有使用的必要 新数组()。为简化性、可读性和执行速度,请使用 第一个(数组字面量方法)。
但同时,使用新的array语法创建新数组被认为是一种糟糕的做法:
避免使用新数组() 不需要使用JavaScript内置的数组构造函数 新数组()。 请使用[]。 这两个不同的语句都创建了一个名为 点:
var points = new Array(); // Bad
var points = []; // Good
这两个不同的语句都创建了一个包含6的新数组 数字:
var points = new Array(40, 100, 1, 5, 25, 10); // Bad
var points = [40, 100, 1, 5, 25, 10]; // Good
new关键字只会使代码复杂化。它也能产生一些 意想不到的结果:
var points = new Array(40, 100); // Creates an array with two elements (40 and 100)
如果我去掉其中一个元素呢?
var points = new Array(40); // Creates an array with 40 undefined elements !!!!!
所以基本上不被认为是最佳实践,这里还有一个小区别,你可以像这样传递length到new Array(length),这也是不推荐的方式。
事情远比看上去的复杂。大多数其他答案是正确的,但也…
新数组(n)
允许引擎为n个元素重新分配空间 为创建数组而优化 创建的数组被标记为稀疏数组具有最少的性能数组操作,这是因为每个索引访问都必须检查边界,查看是否存在值并遍历原型链 如果数组被标记为稀疏,就没有办法返回(至少在V8中),它在生命周期内总是会变慢,即使你在1毫秒或2小时后用内容填充它(打包的数组)也没关系
[1, 2, 3] | | []
创建的数组被标记为已打包(除非使用delete或[1,,3]语法) 针对数组操作进行了优化(用于.., forEach, map等) 随着数组的增长,引擎需要重新分配空间
对于旧版本的浏览器可能不是这样。
在使用承诺时,我发现了一个不同。在使用承诺数组(例如arr,初始化为arr=[])时,在Promise.all(arr)中得到一个错误。而当声明为arr = Array()时,没有得到编译问题。希望这能有所帮助。