redux源码分析:稀疏数组 VS 密集数组

讨论来源:为什么 dispatch 方法中的 listeners 用 for,而不是 forEach 执行
更新于: 2021-12-19 12:57:28

定义

稀疏数组:

在一些后端语言中,如 C,数组内的值通常被分配在一系列连续的内存地址上,但是在 js 中,某些数组内存则不是连续的,所谓稀疏,顾名思义,不连续,存在一些空隙

稀疏数组特点: 

  • 总结一下,创建的稀疏数组,其长度(length)与定义长度值一致;
  • 空隙 值可以被单独访问到,并且不是之前出现的 empty 字样,而是 undefined
  • 比如例子中出现 undefined 时都是使用 arr[i] 这样的索引直接访问方式;
  • 使用某些数组方法如 forEach() 时,会忽略掉空隙值,只处理正常值,所以也会使得 1 in arr3 值为 false,即数组中不存在该索引;
var arr = new Array(3);
console.log(arr);
// (3) [empty × 3]

密集数组

与稀疏相对应,则存在密集,定义也就是元素中不存在 空隙 值,其实密集数组基本就是平时常见的正常数组;

var arr1 = [1, 2, 3];
var arr2 = new Array(1, 2, 3);
arr2.forEach(function(x){
    console.log(x);
});
// 1
// 2
// 3

举例

var arr1 = new Array(3).fill(1);
console.log(arr1);
// [1, 1, 1]

var arr2 = Array.fill().map((x, i) => i);
console.log(arr2);
// [0, 1, 2]

var arr3 = Array.apply(null, Array(3));
console.log(arr3);
// [undefined, undefined, undefined]
// 这样声明的是密集数组,不是稀疏的

var arr4 = new Array(4).join('a').split('');
console.log(arr4);
// ['a', 'a', 'a']
// 注意定义数组长度比输出数组大 1

参考

https://knightyun.github.io/2019/08/02/js-sparse-array