javascript中的稀疏数组(sparse array)和密集数组

时间:2022-03-13 15:35:50

学习underscore.js数组相关API的时候。遇到了sparse array这个东西,曾经没有接触过。

这里学习下什么是稀疏数组和密集数组。

什么是密集数组呢?在java和C语言中,数组是一片连续的存储空间,有着固定的长度。增加数组事实上位置是address。长度为n。那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。例如以下的js代码创建的就是一个密集数组

var data = [3,1,6,9,2];

什么是稀疏数组呢?与密集数组相反。javascript并不强制要求数组元素是紧密相连的,即同意间隙的存在。例如以下的js代码是合法的:

 var sparse = new Array();
sparse[0] = 0;
sparse[3] = 3;
alert(sparse[0]);//输出0
alert(sparse[1]);//输出undefined

1、创建稀疏数组

例如以下代码创建了一个固定长度的稀疏数组

 var a = new Array(3);
a[2] = 1;
alert(a[0]);//undefined
alert(a[2]);//1

说白了js中建立稀疏数组非常easy,仅仅要你有益让数组元素之间存在间隙就可以。如

var arr = [];
arr[0] = 0;
arr[200] = 200;

2、创建密集数组

能够看到js中的数组一般都是稀疏的。一般来说稀疏数组的遍历比較麻烦。

var dense = Array.apply(null, Array(3)); 

这行代码等同于var  dense = Array(undefined, undefined, undefined) ;呵呵是不是认为非常奇怪,这样的方式跟稀疏数组没有什么区别。

看代码:

//稀疏数组
var array = new Array(3);
array[2] = "name"; for(var a in array)
{
console.log("index=" + a + ",value=" + array[a]);
} // 密集数组
var dense = Array.apply(null, Array(3));
dense[2] = "name";
for(var a in dense)
{
console.log("index=" + a + ",value=" + dense[a]);
}

用F12观察控制台输出结果是:

javascript中的稀疏数组(sparse array)和密集数组

能够看到确实是有区别的:稀疏数组仅仅遍历了一次(由于仅仅有一个元素),密集数组遍历了3次。

3、总结

JavaScript中的数组并不像我们在C或java等语言中遇到的常规数组,在js中数组并非起始地址+长度构成的一片连续的地址空间。

javascript中数组事实上就是个对象,仅仅只是会自己主动管理一些"数字"属性和length属性罢了。

说的更直接一点,JavaScript中的数组根本没有索引,由于索引应该是数字,而JavaScript中数组的索引事实上是字符串。

arr[1]事实上就是arr["1"],给arr["1000"] = 1,arr.length也会自己主动变为1001。

这些表现的根本原因就是:JavaScript中的对象就是字符串到随意值的键值对。

尽管稀疏数组和密集数组区别不大,javascript也没有语法强制数组是稀疏的还是密集的,这只是是概念上的区分。

最佳实践是:就把js数组当成是java或C中的数组。由我们程序猿来负责让js的数组元素是连续的

如var array = [1,2,3,4];

如:var array = new Array();array[0]=0;array[1]=1;

这样创建的js数组,就符合我们熟悉的数组了。