性能测试代码
// 测试Array.from创建不同规模数组的性能
function testArrayFrom() {
const sizes = [1000, 10000, 100000];
sizes.forEach(size => {
const start = performance.now();
Array.from({ length: size });
const end = performance.now();
console.log(`Array.from创建长度为${size}的数组耗时: ${end - start} ms`);
});
}
// 测试Array.of创建不同规模数组的性能
function testArrayOf() {
const sizes = [1000, 10000, 100000];
sizes.forEach(size => {
const start = performance.now();
Array.of(...new Array(size));
const end = performance.now();
console.log(`Array.of创建长度为${size}的数组耗时: ${end - start} ms`);
});
}
// 执行测试
testArrayFrom();
testArrayOf();
性能差异原因分析
Array.from()
:
Array.from()
主要用于将类数组对象或可迭代对象转换为数组。当使用Array.from({ length: n })
创建数组时,它会按顺序填充数组的每一个位置,这个过程是逐个赋值的操作,相对来说比较直接。
Array.of()
:
Array.of()
的设计初衷是为了提供一种更方便的创建数组的方式,它的参数就是数组的元素。要创建指定长度的数组,需要使用Array.of(...new Array(size))
这种形式,这里先创建了一个空数组new Array(size)
,然后通过展开运算符将其元素展开作为Array.of()
的参数。这个过程涉及到额外的数组创建和展开操作,相对Array.from()
会更复杂一些,所以在创建大规模数组时性能会稍差。
实际项目中选择合适方法
- 根据功能需求:
- 如果需要将类数组对象(如
arguments
对象、DOMNodeList
等)或可迭代对象(如Set
、Map
等)转换为数组,那么Array.from()
是不二之选。例如:
const args = { 0: 1, 1: 2, length: 2 };
const arr = Array.from(args);
console.log(arr); // [1, 2]
- 如果只是简单地创建包含特定元素的数组,
Array.of()
更为直观。例如:
const arr = Array.of(1, 2, 3);
console.log(arr); // [1, 2, 3]
- 根据性能需求:
- 如果要创建大规模数组,
Array.from()
性能更好,因为其创建过程相对简单直接。
- 如果创建的数组规模较小,性能差异不明显,可优先根据功能需求和代码可读性来选择。