标题所示,我想知道初始化数组的这3种方法之间的区别。
实际上,我更感兴趣的是ES6提供的新的Array.of()方法,为什么觉得需要实现它?
标题所示,我想知道初始化数组的这3种方法之间的区别。
实际上,我更感兴趣的是ES6提供的新的Array.of()方法,为什么觉得需要实现它?
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()
)。
apply()
的绑定版本(到 .of
)然后将其绑定到 Array
上来实现,但这对于一个无意义的示例来说有点太奇怪了。 - PointyArray.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]