MST

星途 面试题库

面试题:JavaScript中多维数组性能优化基础

在JavaScript中,假设有一个二维数组`let arr = Array.from({ length: 100 }, () => Array.from({ length: 100 }, () => Math.random()))`,简述至少两种可以提升该多维数组操作性能的策略。
37.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 减少数组维度
    • 如果业务逻辑允许,尽量将二维数组转化为一维数组。例如,可以通过简单的计算将二维数组的索引映射到一维数组。比如对于arr[i][j],可以转化为一维数组newArr[i * 100 + j](假设原二维数组大小为100x100)。这样在访问元素时可以减少一层循环,从而提升性能。
  2. 缓存数组长度
    • 在对该二维数组进行循环操作时,缓存数组的长度。例如:
    let arr = Array.from({ length: 100 }, () => Array.from({ length: 100 }, () => Math.random()));
    for (let i = 0, len1 = arr.length; i < len1; i++) {
        for (let j = 0, len2 = arr[i].length; j < len2; j++) {
            // 对arr[i][j]进行操作
        }
    }
    
    • 这样避免了每次循环都去获取数组长度,因为获取数组长度是有一定开销的,缓存长度可以减少这种开销,提升性能。
  3. 使用高效的遍历方法
    • 对于现代JavaScript,可以使用for - of循环代替传统的for循环。for - of循环在遍历可迭代对象时性能更好,并且代码更简洁。例如:
    let arr = Array.from({ length: 100 }, () => Array.from({ length: 100 }, () => Math.random()));
    for (let subArr of arr) {
        for (let value of subArr) {
            // 对value进行操作
        }
    }
    
    • 还可以考虑使用forEach等数组方法,但要注意forEach内部的回调函数会带来一定的函数调用开销,所以在性能敏感场景下,for - of可能更优。
  4. 优化内存使用
    • 如果数组中的数据类型比较单一,可以考虑使用TypedArray(如Float32Array等)来代替普通的JavaScript数组。TypedArray在内存使用和操作效率上都有优势,因为它们在底层使用更紧凑的二进制存储。例如,可以先将二维数组的数据提取出来,再使用TypedArray进行存储和操作。但要注意TypedArray不支持多维数组直接创建,可能需要一些额外的转换。
  5. 避免不必要的中间操作
    • 在对数组进行操作时,尽量避免创建不必要的中间数组。例如,如果要对该二维数组进行过滤等操作,尽量在原数组上进行修改(如果逻辑允许),而不是先创建一个新的数组来存储过滤结果。一些数组方法如mapfilter等会返回新的数组,这可能会带来额外的内存开销和性能损耗。如果必须创建新数组,可以考虑使用更高效的方式,比如使用reduce方法一次性构建新数组,减少中间步骤。