稀疏數組就是包含從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值。