当前位置:首页 » 服务存储 » 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);