数组的大小javascript
js数组能够动态调整大小,更确切点说,它没有数组越界的概念,a[a.length]没什么问题。好比声明一个数组a = [1, 3, 5],如今的数组大小是3,最后一个元素的索引是2,可是你依然可使用a[3],访问a[3]返回的是undefined,给a[3]赋值:a[3] = 7,是给数组a添加了一个元素,如今数组a的长度是4了。你能够试试把下面这段代码放到浏览器里运行下:html
在个人电脑上,火狐会立马崩掉,chrome这一个标签cpu占用99%(使用chrome的任务管理器查看的)。前端
js的length的值会随着数组元素的改变而改变,固然你也能够手动设置数组的 length 属性,设置更大的length不会给数组分配更多的空间,可是设置更小的length则会致使全部下标大于等于新length的属性被删除。java
另外有一点就是,数组的length值是怎么来的,有的资料说是最大一个数字索引值加一,应该是对的,不过若是把空槽也算数的话,length值就是数组的元素数。python
从图里能够看到,有个数组a,a[0]和a[10]都已赋值,这时候a的length是11,中间有9个empty slot(姑且就翻译为空槽好了)。那这九个空槽算不算数呢,我以为应该算,这样就能合理的解释length值了。那这些空槽的值是什么呢?undefined!因此呢,若是在chrome里,使用foreach遍历(forin),那么这些空槽正好都能跳过,而使用for遍历,则会打印出undefined。至于在firefox里,表现不太同样,本身试吧。面试
数组的遍历chrome
昨天在看微博上转的js教程的时候,里面说在遍历数组的时候,判断语句i<a.length会形成每循环一次都要计算一次长度,从而对性能有一点点影响。这一点我表示疑问,我不肯定究竟是不是这样,并且不一样的浏览器对这种状况可能还有不一样的优化,我在网上搜了下,找到了几个网页说了要缓存数组大小,可是都是抄的,没主见,也没说明原理,因此我表示很怀疑,并且我在chrome测试了下,性能上没什么明显差别。关键是我以为,length是个数组的属性,每次调用a.length的时候,只是访问这个属性而已,属性都是用hash的方式存储的,因此访问的时间复杂度是O(1)。这是个人见解,若是不对,请告诉我。c#
关于数组的foreach遍历,js的方式相对于java/c#等语言是很奇怪的:数组
for(var name in ['huey', 'dewey', 'louie']) { console.log(name); } /* 打印结果: 0 1 2 */
能够看到,打印的结果不是数组的元素,而是数字索引值(感受这好像也能够说明,js的数组也是用hash的方式存储的),无论怎样,这一点要注意。(至于为何这样,我以为数组元素都是数组的属性,这个遍历是遍历的length值,从0到length。而不是逐个输出数组的元素,由于元素是属性,数组又不仅数字索引这一种属性,那么为何这样遍历的时候只输出它们呢,而不是length,push,join等方法?公平起见,只好输出数组的数字索引了。固然,这只是我本身的见解,具体怎么样我没研究。)浏览器
数组的一些方法
数组有push和pop方法,这样数组就像堆栈同样了。对数组使用delete,能够将数组中某个元素移除,可是那样会在数组中留下一个空洞(也就是说delete也能够删除数组中的元素,可是只是删除该位置的值,不改变数组大小,原位置类型是undefined),这是由于排在被删除元素以后的元素保留着它们最初的属性,因此应该使用splice对进行过delete操做的数组进行瘦身,它会将被删除的属性移除,但这样效率并非很高。数组中还有map、reduce、filter等方法,这里就很少说了(跟python中的list挺像的)。
补充
最后补充一点,我前面说过,js中的数组就是对象(废话,原本就是对象),那么是否是说,数组和对象能够互相互替换着用呢?答案是能够的。不过为了明确,仍是分开用比较好,下面说下何时该用数组,何时该用对象(参考《javascript语言精粹》):
当属性名是小而连续的整数时,应该使用数组,不然,使用对象。
另外因为js中对数组和对象使用 typeof 的结果都是 Object,所以判断一个对象是否为数组的方法:
var is_array = function(value) { return Object.prototype.toString.apply(value) === '[object Array]'; };
番外
以为闭包被神化了,可能语言层面上的实现有技术,可是在应用层面我以为就应该那样啊,使用的时候都感受不到那是在用闭包。可是这个闭包却几乎成了面试前端必问的概念了。
以上所述就是本文的所有内容了,但愿你们可以喜欢。