Skip to content

JavaScript中稀疏数组和密集数组的详解 ​

什么是稀疏数组和密集数组? ​

稀疏数组(Sparse Array) ​

  • 定义:索引不连续,数组长度大于元素个数的数组
  • 特点:包含empty(空位)元素,这些位置没有被初始化
  • 示例:
javascript
let arr1 = new Array(5);
console.log(arr1);   // [empty × 5]

let arr2 = [1, 3, , ,];
console.log(arr2);   // [1, 3, empty × 2]

密集数组(Dense Array) ​

  • 定义:索引连续,数组长度等于元素个数的数组
  • 特点:每个位置都有确定的值(包括null或undefined)

如何处理稀疏数组? ​

1. 遍历方法的区别 ​

forEach/map 方法 ​
  • 特点:会跳过空位元素,callback 函数不会执行
javascript
let arr = [1, 3, , , , 45];
arr.forEach(item => {
    console.log(item);  // 只输出:1, 3, 45
});
for 循环 ​
  • 可以访问到空位元素,值为undefined
  • 两种判断方式:
javascript
let arr = [1, 3, , , , 45];

// 方法1:使用 null 判断
for (let i = 0; i < arr.length; i++) {
    if (arr[i] == null) {
        console.log('空位');
    }
}

// 方法2:使用 in 运算符(推荐)
for (let i = 0; i < arr.length; i++) {
    if (i in arr) {
        console.log(arr[i]);  // 只输出实际存在的元素
    }
}

2. 将稀疏数组转换为密集数组 ​

使用fill方法可以将稀疏数组转换为密集数组:

javascript
let sparseArray = new Array(5);              // [empty × 5]
let denseArray = new Array(5).fill(null);    // [null, null, null, null, null]

最佳实践 ​

  • 在实际开发中,建议尽量避免使用稀疏数组
  • 如果必须处理稀疏数组,推荐使用in运算符来判断元素是否存在
  • 需要初始化数组时,优先使用fill方法创建密集数组