手机版

浅谈Javascript数组的使用

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

上一篇文章讨论了数组的索引,而这篇文章讨论了数组的使用。

数组大小

Js的数组可以动态调整大小。更准确地说,它没有数组越界的概念,a[a.length]就可以了。例如,如果您声明一个数组a=[1,3,5],数组的大小现在是3,最后一个元素的索引是2,但是您仍然可以使用a[3]。当你访问a[3]时,你返回undefined,给a[3]赋值:a[3]=7,这就给数组A增加了一个元素,现在数组A的长度是4。您可以尝试将以下代码放入浏览器并运行它:

var a=[];for(int I=0;i=a .长度;I){ a[a . length]=I;}在我的电脑上,Firefox会立即崩溃,tag chrome占据了99%的cpu(使用chrome的任务管理器查看)。

js的长度值会随着数组元素的变化而变化。当然也可以手动设置数组的长度属性。设置更大的长度不会为数组分配更多空间,但设置更小的长度会导致下标大于或等于新长度的所有属性被删除。

还有一点,数组的长度值是怎么来的?有资料说,最大数值指标值加一应该是正确的。但是,如果计算空槽,长度值就是数组的元素数。上图解释道:

从图中可以看出,数组A、a[0]和a[10]都已赋值。此时A的长度为11,中间有9个空槽。这九个空位算吗?我觉得应该,这样长度值才能合理解释。这些空槽的值是多少?未定义!因此,如果在chrome中使用foreach遍历(forin),这些空槽可以被精确地跳过,如果使用for遍历,将会打印出undefined。至于火狐,性能就不一样了。你自己试试。

数组遍历

昨天看微博上传的js教程,说遍历数组时,判断ia.length语句会导致长度每循环计算一次,对性能影响不大。我怀疑这一点。我不确定是不是这样,不同的浏览器对于这种情况可能会有不同的优化。我在网上搜了几个说缓存数组大小的网页,但是都是抄袭的,没有自己的见解,也没有说明原理,所以就表达了我的疑惑。而且,我在chrome测试后,性能没有明显的差别。关键是我认为长度是数组的一个属性。每次调用a.length,都只是访问这个属性,这个属性存储在hash中,所以访问的时间复杂度为O(1)。这是我的看法。如果是错的,请告诉我。

关于数组的foreach遍历,与java/c#等语言相比,js的方式非常奇怪:

for(var name in ['huey ',' dewey ',' Louie ']){ console . log(name);}/*打印结果:0 1 2 */可以看出打印结果不是数组的一个元素,而是一个数值索引值(似乎这也可以说明js的数组也是以hash模式存储的)。但是,我们应该注意这一点。(至于为什么,我觉得所有数组元素都是数组的属性,这个遍历就是遍历的长度值,从0到长度。而不是一个一个的输出数组的元素,因为元素是属性,数组不仅仅是数值索引,为什么像这样遍历的时候只输出,而不是length,push,join的方法呢?平心而论,我们必须输出数组的数值索引。当然,这只是我自己的看法。我还没有研究细节。)

数组的一些方法

数组有push和pop方法,所以数组就像一个堆栈。在数组上使用delete可以删除数组中的一个元素,但是会在数组中留下一个洞(也就是说delete也可以删除数组中的元素,但是只删除这个位置的值,不改变数组的大小,原始的位置类型是未定义的)。这是因为被删除的元素后面的元素保留了它们原来的属性,所以在DELETE操作后应该使用拼接来精简数组,这样会删除被删除的属性,但是这样是有效率的。数组中还有map、reduce、filter等方法,这里就不多说了(类似python中的列表)。

补充

最后,我前面说js中的数组是对象(废话,是对象),那么是不是意味着数组和对象可以互换使用呢?答案是肯定的。但是,为了清楚起见,最好将它们分开使用。我们来说说什么时候用数组,什么时候用对象(参考《javascript语言精粹》):

当属性名为小的连续整数时,应使用数组;否则,应该使用对象。另外,因为js中对数组和对象使用typeof的结果是Object,所以判断一个对象是否是数组的方法是:

var is _ Array=function(value){ return object . prototype . tostring . apply(value)=='[object Array]';};饭外

感觉闭包被神化了,可能是语言层面的现有技术,但在应用层面,我觉得应该是这样的。用的时候感觉不到它在用闭包。然而,这种封闭几乎成了面试前端的必备概念。

以上就是本文的全部内容,希望大家喜欢。

版权声明:浅谈Javascript数组的使用是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。