javascript稀疏陣列(sparse array)和密集陣列用法分析

javascript稀疏陣列(sparse array)和密集陣列用法分析

本文例項講述了javascript稀疏陣列(sparse array)和密集陣列用法。分享給大家供大家參考,具體如下:

學習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中建立稀疏陣列很容易,只要你故意讓陣列元素之間存在間隙即可。如


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觀察控制檯輸出結果是:

可以看到確實是有差別的:稀疏陣列只遍歷了一次(因為只有一個元素),密集陣列遍歷了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陣列,就符合我們熟悉的陣列了。

更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《JavaScript陣列操作技巧總結》、《JavaScript排序演算法總結》、《JavaScript遍歷演算法與技巧總結》、《JavaScript數學運算用法總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript查詢演算法技巧總結》及《JavaScript錯誤與除錯技巧總結

希望本文所述對大家JavaScript程式設計有所幫助。

您可能感興趣的文章:

JavaScript中的稀疏陣列與密集陣列[譯]JavaScript中利用Array filter() 方法壓縮稀疏陣列