稀疏数组就是包含从0开始的不连续索引的数组。通常,数组的length属性值代表数组中元素的个数。如果数组是稀疏的,length属性值大于元素的个数。可以用Array()构造函数或简单地指定数组的索引值大于当前数组长度来创建稀疏数组。
a = new Array(5); //数组没有元素,但是a.length是5
a = []; //创建一个空数组,length = 0;
a[1000] = 0; //赋值添加一个元素,但是设置length为1001
也可以用delete操作符来生产稀疏数组。
足够稀疏的数组通常上在实现上比稠密的数组更慢、内存利用率更高,这样的数组中查找元素的时间与常规对象属性的查找时间一样长。
注意,当在数组直接量中省略值时不会创建稀疏数组。省略的元素在数组中是存在的,其值为undefined。这和数组元素根本不存在石油一些微妙地其区别的。可以用in操作符检测两者之间的区别:
var a1 = [,,,]; //数组是[undefined,undefined.undefined]
var a2 = new Array(3); //该数组根本没有元素
0 in a1 //true:a1在索引0处有一个元素
0 in a2 //false:a2在索引0处没有元素
当使用for/in循环时,a1和a2之间的区别也很明显
需要注意的是,当省略数组直接量中的值时(使用连续的逗号,比如[1,,3],这时所得到的数组也是稀疏数组,省略掉的值是不存在的:
var a1 = [,]; //此数组没有元素,长度是1
var a2 = [undefined]; //此数组包含一个值为undefined的元素
0 in a1 //false: a1在索引0处没有元素
0 in a2 //true:a2在索引0处有一个值为undefined的元素
了解稀疏数组是了解JavaScript数组的真实本质的一部分。尽管如此,实际上你所碰到的绝大多数JavaScript数组不是稀疏数组。并且,如果你确实碰到了稀疏数组,你的代码很可能像对待非稀疏数组一样来对待他们,只不过它们包含一些undefined值。