文章目录
- 稀疏数组(javascript)
- 稀疏数组的特点:
- 如何创建稀疏数组:
- 稀疏数组的行为:
- 稀疏数组的实际应用:
- 注意事项:
javascript_1">稀疏数组(javascript)
在 JavaScript 中,稀疏数组(sparse array) 是一种数组,其中部分索引是未定义的或未被分配值。与普通的“密集数组”不同,稀疏数组的某些索引上没有实际的元素(即没有显式分配值),但这些索引在逻辑上是存在的。
稀疏数组的特点:
-
缺少的元素:
稀疏数组的某些索引处是“空的”(没有显式的值)。这些位置会被认为是“未初始化”的。 -
长度计算:
稀疏数组的 length 属性会考虑数组中最大索引+1,而不会因为某些索引没有值而减少。 -
性能差异:
稀疏数组可能会影响性能,因为 JavaScript 引擎在处理稀疏数组时需要额外工作来处理这些“缺失的”索引。
如何创建稀疏数组:
以下是创建稀疏数组的一些方法:
- 使用 Array 构造函数
javascript">let sparseArray = new Array(10); // 创建了一个长度为 10 的稀疏数组
console.log(sparseArray); // [ <10 empty items> ]
console.log(sparseArray.length); // 10
- 使用索引直接赋值
javascript">let sparseArray = [];
sparseArray[3] = "JavaScript"; // 只给索引 3 赋值
console.log(sparseArray); // [ <3 empty items>, 'JavaScript' ]
console.log(sparseArray.length); // 4
- 删除元素
javascript">let denseArray = [1, 2, 3];
delete denseArray[1]; // 删除索引 1 的元素
console.log(denseArray); // [ 1, <1 empty item>, 3 ]
console.log(denseArray.length); // 3
稀疏数组的行为:
索引不存在:
未赋值的索引不会显示在迭代中,例如通过 forEach 或 map 方法。
javascript">let sparseArray = [1, , 3];
sparseArray.forEach((value, index) => {console.log(index, value); // 输出:0 1 和 2 3,忽略空位
});
undefined vs 空元素:
空位与 undefined 不同,空位实际上是“不存在”的。
javascript">let arr = [1, , 3];
console.log(arr[1]); // 输出:undefined
console.log(1 in arr); // 输出:false(表示索引 1 并不存在)
使用 in 运算符检测空位:
in 运算符可以用来检查索引是否在数组中。
javascript">let sparseArray = [1, , 3];
console.log(1 in sparseArray); // false(空位不存在)
sparseArray[1] = undefined;
console.log(1 in sparseArray); // true(已定义但值为 undefined)
迭代方法的表现:
- forEach、map、filter 等会跳过稀疏数组中的空位。
- for…in 和 Object.keys 只会遍历实际存在的索引。
- for…of 也会跳过空位。
稀疏数组的实际应用:
- 表示大型矩阵数据,节省存储空间。
- 临时跳过某些索引的数据操作。
注意事项:
尽量避免无意间创建稀疏数组,因为这可能导致代码难以调试。
如果必须使用稀疏数组,建议明确文档化其意图。
如果想检查稀疏数组中的空位,可以使用以下方法:
javascript">let sparseArray = [1, , 3];
console.log(sparseArray.map((x, i) => x ?? `empty at index ${i}`));
// 输出:[1, "empty at index 1", 3]