當前位置:首頁 » 服務存儲 » js數組內存存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

js數組內存存儲

發布時間: 2022-12-11 13:16:55

1. js數組和鏈表的區別

首先從邏輯結構上說,兩者都是數據結構的一種,但存在區別,數組是申請的一塊連續的內存空間,並且是在編譯階段就要確定空間大小的,同時在運行階段是不允許改變的,所以它不能夠隨著需要的改變而增加或減少空間大小,所以當數據量大的時候,有可能超出了已申請好的數組上限,產生數據越界,或者是數據量很小,對於沒有使用的數組空間,造成內存浪費。鏈表則是動態申請的內存空間,並不像數組一樣需要事先申請好大小,鏈表是現用現申請就OK,根據需求動態的申請或刪除內存空間,對於的是增加或刪除數據,所以比數組要靈活。再從物理存儲即內存分配上分析,數組是連續的內存,對於訪問數據,可以通過下標直接讀取,時間復雜度為O(1),而添加刪除數據就比較麻煩,需要移動操作數所在位置後的所有數據,時間復雜度為O(N)。鏈表是物理上非連續的內存空間,對於訪問數據,需要從頭便利整個鏈表直到找到要訪問的數據,沒有數組有效,但是在添加和刪除數據方面,只需要知道操作位置的指針,很方便可以實現增刪,教數組比較靈活有效率。所以綜合以上,對於快速訪問數據,不經常有添加刪除操作的時候選擇數組實現,而對於經常添加刪除數據,對於訪問沒有很高要求的時候選擇鏈表。

2. js創建Array數組保存數據,數據是存放在哪裡的呢容量有上限的嗎

和其他編程語言一樣,js的數組以連續的存儲空間存儲在內存中,容量應當與物理內存地址大小有關系。

3. JavaScript對數組存儲容量有限制嗎

Javascript自身提供了一些操作,可以對數組實現一定的處理,例如排序、連接、堆棧等等,下面做一下簡單的介紹。

1,concat(arrayName2, arrayName3, …, arrayNameN) ,將數組本身和另外一個或多個數組進行連接,例如:
var arr1=[」a」,」c」];
var arr2=[」b」,」d」];
var arr22=[」e」,」f」];
var arr3=arr1.concat(arr2,arr22);
document.write(arr3);//結果顯示為:a,c,b,d,e,f

2,join(separator),通過間隔符將數字連接為字元串,例如:
var arr1=[」a」,」b」,」c」,」d」,」e」];
var arr1Str=arr1.join(」-」);
document.write(arr1Str);//結果顯示為:a-b-c-d-e

3,pop()/push(element1, …, elementN) ,實現了堆棧的操作,push是入棧,pop是出棧,例如:
var arr1=[」a」,」b」];
arr1.push(」c」,」d」);
document.write(arr1);//結果為:a,b,c,d
var value=arr1.pop();
document.write(value);//結果為:d

4,reverse() ,將數組反向排序,例如:
var arr1=[」a」,」b」,」c」];
arr1.reverse();
document.write(arr1);//結果為:c,b,a

5,sort(compareFunction),按照指定的排序規則進行排序,如果參數為空,則按照默認的字母和數字進行排序,例如:
function mySort(o1,o2){
if(o1.length>o2){
return 1;
}
return -1;
}
var arr1=[」a」,」c」,」bd」];
arr1.sort();
document.write(arr1);//結果為:a,bd,c
arr1.sort(mySort);
document.write(arr1);//結果為:bd,c,a

6,shift() /unshift,將數組的第一個值取出(或者將值插入到數組第一個位置),並且數組長度縮短(加長),例如:
var arr1=[」a」,」b」,」c」];
var value=arr1.shift();
document.write(value);//輸出為:a
document.write(arr1);//輸出為:b,c
var value2=arr1.unshift(」g」);
document.write(value);//IE輸出為undefined,Firefox輸出為3
document.write(arr1);//輸出為:g,b,c

7,slice(begin[,end]) ,類似字元串的substring方法,就是截取數組,例如:
var arr1=[」a」,」b」,」c」];
var arr2=arr1.slice(0,2);
document.write(arr2);//輸出為:a,b

8,splice(index, howMany, [element1][, …, elementN]) ,從指定的位置(index)開始,刪除後面多個(howMany)數組的值,並從刪除處開始依次插入新的值,例如:
var arr1=[」a」,」b」,」c」];
arr1.splice(1,1,」m」,」n」,」o」);
document.write(arr1);//輸出為:a,m,n,o,c

應該說,Javascript本身對數組提供的操作能力,還是不錯的,但是在實際應用中,我們需要對數組做更多的操作,例如Java、PHP、.NET中對數組都提供了強大的操作能力,而且許多優秀的開源項目中,也提供了對數組的許多操作,但是Javascript這方面還需要進一步加強。

為了對數組提供更多的操作,JsJava定義了許多類,來加強對數組的操作,介紹如下:

1,jsjava.util.Arrays類,仿照Java的Arrays類,對數組提供了一些高效的操作,例如:
var list=Arrays.asList([」a」,」b」,」c」]);//通過數組創建一個不可變的列表
而且通過binarySearch,提供了二分法搜索的一個實現,其它的請參考JsJavaDoc

2,jsorg.apache.commons.lang.ArrayUtils類,該類的實現是參考Apache優秀的commons-lang開源項目實現的,實現其中的所有功能,例如對數組進行插入、刪除、搜索、填充、截取等等,例如:
var arr=ArrayUtils.clone([0,1,2,9,0]);
document.write(arr+」<br>」);
document.write(ArrayUtils.subarray(arr,0,3)+」<br>」);
arr.reverse();
document.write(arr);
顯示結果為:
0,1,2,9,0
0,1,2
0,9,2,1,0

3,jsorg.eob.lang.MultiDimensionArrayUtils類,該類實現了對多維數組的創建支持,例如可以方便創建二維和三維數組,具體可以參考文章《在Javascript之中如何創建多維數組》

4,org.apache.commons.math.linear.RealMatrixImpl類,實現對矩陣的操作,矩陣實際上就是多維數組,即實現了對多維數組的支持,例如可以實現多維數組的加、減、乘、除等操作,還有數學運算中對矩陣的其它操作,具體可以參考JsJavaDoc。

JsJava是對Javascript語言最好的擴展和延伸,它與目前流行的prototype.js的方向是不一樣的,如果你正在構建web應用,那麼JsJava將是你界面應用最好的支撐。

4. JS 的問題,怎麼獲取 localStorage 已存儲的數組

有時候,我們需要將數據存儲到sessionStorage和localStorage中,這樣做的好處有:

1 緩存數據

2 減少對內存的佔用

但是,storage只能存儲字元串的數據,對於JS中常用的數組或對象卻不能直接存儲。

1
2
3
4
5
6
7
var obj = { name:'Jim' };
sessionStorage.obj = obj;
localStorage.obj = obj;

var arr = [1,2,3];
sessionStorage.obj = arr;
localStorage.obj = arr;
上面的寫法都是不能成功的!但我們可以通過JSON對象提供的parse和stringify將其他數據類型轉化成字元串,再存儲到storage中就可以了。請看下面的代碼。

1
2
3
4
5
6
var obj = { name:'Jim' };
var str = JSON.stringify(obj);

//存入 sessionStorage.obj = str;
//讀取 str = sessionStorage.obj;
//重新轉換為對象 obj = JSON.parse(str);