MST

星途 面试题库

面试题:JavaScript创新数组创建方法的性能分析

在JavaScript中,`Array.from()`和`Array.of()`都是较新的数组创建方法。请编写代码测试这两种方法在创建不同规模数组时的性能(例如,创建长度为1000、10000、100000的数组),并分析性能差异产生的原因。此外,阐述在实际项目中,如何根据性能和功能需求选择合适的数组创建方法。
15.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

性能测试代码

// 测试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();

性能差异原因分析

  1. Array.from()
    • Array.from()主要用于将类数组对象或可迭代对象转换为数组。当使用Array.from({ length: n })创建数组时,它会按顺序填充数组的每一个位置,这个过程是逐个赋值的操作,相对来说比较直接。
  2. Array.of()
    • Array.of()的设计初衷是为了提供一种更方便的创建数组的方式,它的参数就是数组的元素。要创建指定长度的数组,需要使用Array.of(...new Array(size))这种形式,这里先创建了一个空数组new Array(size),然后通过展开运算符将其元素展开作为Array.of()的参数。这个过程涉及到额外的数组创建和展开操作,相对Array.from()会更复杂一些,所以在创建大规模数组时性能会稍差。

实际项目中选择合适方法

  1. 根据功能需求
    • 如果需要将类数组对象(如arguments对象、DOMNodeList等)或可迭代对象(如SetMap等)转换为数组,那么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]
    
  2. 根据性能需求
    • 如果要创建大规模数组,Array.from()性能更好,因为其创建过程相对简单直接。
    • 如果创建的数组规模较小,性能差异不明显,可优先根据功能需求和代码可读性来选择。