Array.of(n),Array(n)和array=[n]之间有什么区别?

14

标题所示,我想知道初始化数组的这3种方法之间的区别。

实际上,我更感兴趣的是ES6提供的新的Array.of()方法,为什么觉得需要实现它?


我已经看过了,也许我的问题不太清楚。我正在寻找实际用例的实际解释,而不是简单的文档剪切和粘贴。无论如何,谢谢@AmmarCSE。 - Stefano Saitta
2个回答

21

Array构造函数可以通过两种方式调用:一种是使用值列表作为数组元素的值,另一种是使用单个数字值来指定初始长度:

var myArray = new Array("hello", "world"); // 2 elements
var otherArray = new Array(100); // 100 elements, all empty

因为当只传递一个数字时存在歧义,所以那个旧的API被认为设计不良。因此,有一个Array.of(),它与数组构造函数的第一个选项相同:

var otherArray = Array.of(100); // 1 element
使用数组初始化表达式是创建数组的第三种方式:
var otherArray = [100]; // 1 element

以上每个方法所创建的数组实例在功能上是相等并且完全可互换的。

还有一件事:既然我们可以使用数组初始化表达式,为什么需要Array.of()呢?好吧,因为Array.of()是一个函数,所以它可以用作应用于函数式编程中的值。你可以(例如)使用以下方式复制一个数组:

var copy = Array.of.apply(Array, original);

这种做法愚蠢的原因之一是,ES2015中还有Array.from()可以完成同样的功能:

var copy = Array.from(original);

这个方法适用于任何类型的可迭代对象,因此将arguments或NodeList转换为数组是一个不错的方式。

MDN网站有关于Array.of()的文档。构造函数和数组初始化器形式已经存在很久了,因此任何JavaScript参考资料都会涵盖它们(尽管可能没有提到Array.of())。


1
@thefourtheye 哦,你说得对 :) 我必须通过创建 apply() 的绑定版本(到 .of)然后将其绑定到 Array 上来实现,但这对于一个无意义的示例来说有点太奇怪了。 - Pointy
我们甚至可以在您的答案中添加一些参考链接,以使其更完整。像这样的东西似乎很有用 @Pointy - Stefano Saitta
好主意。值得注意的是,截至目前,InternetExplorer不支持新的ES2015方法。 - Pointy
1
明天起,IE 将不再受到支持 :) - Stefano Saitta
@StefanoSaitta 对啊,但是Edge也不支持这些功能。 - Pointy
显示剩余3条评论

3
< p > Array.of(2)将创建一个只包含元素2的数组。

var temp = Array.of(2); // temp = [2]

Array(2) 将创建一个有2个元素的数组。

var temp = new Array(2); // temp = [undefined, undefined]

temp = [2] 将创建一个只有一个元素 2 的数组。

var temp = [2]; // temp = [2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接