javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法分析
本文實(shí)例講述了javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法。分享給大家供大家參考,具體如下:
學(xué)習(xí)underscore.js數(shù)組相關(guān)API的時(shí)候,遇到了sparse array這個(gè)東西,以前沒有接觸過。
這里學(xué)習(xí)下什么是稀疏數(shù)組和密集數(shù)組。
什么是密集數(shù)組呢?在Java和C語言中,數(shù)組是一片連續(xù)的存儲(chǔ)空間,有著固定的長度。加入數(shù)組其實(shí)位置是address,長度為n,那么占用的存儲(chǔ)空間是address[0],address[1],address[2].......address[n-1]。即數(shù)組元素之間是緊密相連的,不存在空隙。如下的js代碼創(chuàng)建的就是一個(gè)密集數(shù)組
var data = [3,1,6,9,2];
什么是稀疏數(shù)組呢?與密集數(shù)組相反,javascript并不強(qiáng)制要求數(shù)組元素是緊密相連的,即允許間隙的存在。如下的js代碼是合法的:
var sparse = new Array(); sparse[0] = 0; sparse[3] = 3; alert(sparse[0]);//輸出0 alert(sparse[1]);//輸出undefined
1、創(chuàng)建稀疏數(shù)組
如下代碼創(chuàng)建了一個(gè)固定長度的稀疏數(shù)組
var a = new Array(3); a[2] = 1; alert(a[0]);//undefined alert(a[2]);//1
說白了js中建立稀疏數(shù)組很容易,只要你故意讓數(shù)組元素之間存在間隙即可。如
var arr = []; arr[0] = 0; arr[200] = 200;
2、創(chuàng)建密集數(shù)組
可以看到j(luò)s中的數(shù)組一般都是稀疏的,一般來說稀疏數(shù)組的遍歷比較麻煩。
var dense = Array.apply(null, Array(3));
這行代碼等同于var dense = Array(undefined, undefined, undefined) ;呵呵是不是覺得很奇怪,這種方式跟稀疏數(shù)組沒有什么差別。看代碼:
//稀疏數(shù)組
var array = new Array(3);
array[2] = "name";
for(var a in array)
{
console.log("index=" + a + ",value=" + array[a]);
}
// 密集數(shù)組
var dense = Array.apply(null, Array(3));
dense[2] = "name";
for(var a in dense)
{
console.log("index=" + a + ",value=" + dense[a]);
}
用F12觀察控制臺(tái)輸出結(jié)果是:

可以看到確實(shí)是有差別的:稀疏數(shù)組只遍歷了一次(因?yàn)橹挥幸粋€(gè)元素),密集數(shù)組遍歷了3次。
3、總結(jié)
JavaScript中的數(shù)組并不像我們?cè)贑或java等語言中遇到的常規(guī)數(shù)組,在js中數(shù)組并不是起始地址+長度構(gòu)成的一片連續(xù)的地址空間。
javascript中數(shù)組其實(shí)就是個(gè)對(duì)象,只不過會(huì)自動(dòng)管理一些"數(shù)字"屬性和length屬性罷了。
說的更直接一點(diǎn),JavaScript中的數(shù)組根本沒有索引,因?yàn)樗饕龖?yīng)該是數(shù)字,而JavaScript中數(shù)組的索引其實(shí)是字符串。
arr[1]其實(shí)就是arr["1"],給arr["1000"] = 1,arr.length也會(huì)自動(dòng)變?yōu)?001。
這些表現(xiàn)的根本原因就是:JavaScript中的對(duì)象就是字符串到任意值的鍵值對(duì)。
雖然稀疏數(shù)組和密集數(shù)組差別不大,javascript也沒有語法強(qiáng)制數(shù)組是稀疏的還是密集的,這不過是概念上的區(qū)分。
最佳實(shí)踐是:就把js數(shù)組當(dāng)成是java或C中的數(shù)組,由我們程序員來負(fù)責(zé)讓js的數(shù)組元素是連續(xù)的。
如
var array = [1,2,3,4];
如:
var array = new Array();array[0]=0;array[1]=1;
這樣創(chuàng)建的js數(shù)組,就符合我們熟悉的數(shù)組了。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript判斷是否為數(shù)字的4種方法及效率比較
這篇文章主要介紹了JavaScript判斷是否為數(shù)字的4種方法及效率比較,本文直接給出判斷方法實(shí)現(xiàn)代碼及運(yùn)行效率效果圖,方便大家選擇使用,需要的朋友可以參考下2015-04-04
用js實(shí)現(xiàn)小球的自由移動(dòng)代碼
本篇文章小編為大家介紹,用js實(shí)現(xiàn)小球的自由移動(dòng)代碼。需要的朋友參考下2013-04-04
Javascript獲取統(tǒng)一管理的提示語(message)
這篇文章主要介紹了Javascript獲取統(tǒng)一管理的提示語(message)的相關(guān)資料,需要的朋友可以參考下2016-02-02
詳解Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用
許多應(yīng)用程序中都會(huì)有日志模塊,用于記錄系統(tǒng)在運(yùn)行過程中的一些關(guān)鍵信息,以便于對(duì)系統(tǒng)的運(yùn)行狀況進(jìn)行跟蹤。這篇文章給大家主要介紹了在Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用,需要的朋友可以參考借鑒,下面來一起看看吧。2016-12-12
three.js實(shí)現(xiàn)3D模型展示的示例代碼
本篇文章主要介紹了three.js實(shí)現(xiàn)3D模型展示的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
JavaScript實(shí)現(xiàn)查找字符串中第一個(gè)不重復(fù)的字符
這篇文章主要介紹了JavaScript實(shí)現(xiàn)查找字符串中第一個(gè)不重復(fù)的字符,需要的朋友可以參考下2014-12-12

