面试题答案
一键面试- 减少数组维度:
- 如果业务逻辑允许,尽量将二维数组转化为一维数组。例如,可以通过简单的计算将二维数组的索引映射到一维数组。比如对于
arr[i][j]
,可以转化为一维数组newArr[i * 100 + j]
(假设原二维数组大小为100x100)。这样在访问元素时可以减少一层循环,从而提升性能。
- 如果业务逻辑允许,尽量将二维数组转化为一维数组。例如,可以通过简单的计算将二维数组的索引映射到一维数组。比如对于
- 缓存数组长度:
- 在对该二维数组进行循环操作时,缓存数组的长度。例如:
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]进行操作 } }
- 这样避免了每次循环都去获取数组长度,因为获取数组长度是有一定开销的,缓存长度可以减少这种开销,提升性能。
- 使用高效的遍历方法:
- 对于现代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
可能更优。
- 对于现代JavaScript,可以使用
- 优化内存使用:
- 如果数组中的数据类型比较单一,可以考虑使用
TypedArray
(如Float32Array
等)来代替普通的JavaScript数组。TypedArray
在内存使用和操作效率上都有优势,因为它们在底层使用更紧凑的二进制存储。例如,可以先将二维数组的数据提取出来,再使用TypedArray
进行存储和操作。但要注意TypedArray
不支持多维数组直接创建,可能需要一些额外的转换。
- 如果数组中的数据类型比较单一,可以考虑使用
- 避免不必要的中间操作:
- 在对数组进行操作时,尽量避免创建不必要的中间数组。例如,如果要对该二维数组进行过滤等操作,尽量在原数组上进行修改(如果逻辑允许),而不是先创建一个新的数组来存储过滤结果。一些数组方法如
map
、filter
等会返回新的数组,这可能会带来额外的内存开销和性能损耗。如果必须创建新数组,可以考虑使用更高效的方式,比如使用reduce
方法一次性构建新数组,减少中间步骤。
- 在对数组进行操作时,尽量避免创建不必要的中间数组。例如,如果要对该二维数组进行过滤等操作,尽量在原数组上进行修改(如果逻辑允许),而不是先创建一个新的数组来存储过滤结果。一些数组方法如