这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的, javascript 中 for 循环也是非常常用的, 下面这篇文章主要介绍了 Javascript 中 for 循环的几种写法, 需要的朋友可以参考借鉴,一起来看看吧。
前言
for 循环我们在 js 遍历对象或数组时都会有用到了,今天我们一起来看一些关于 for 循环的一些使用例子了,具体的操作细节如下文介绍。
一般写法如下:
- for(var i = 0;i< arr.length;i++) {
- var a = arr[i];
- //...
- }
这就是一个常见的,正序循环的 for 循环。这样写的缺点大家都明白:每次都从 arr 里取 length 与 i 来对比,浪费性能(而且,要是 arr 的长度是动态变化的,就会出现死循环)。改进这个循环的办法是用变量保存
:
- arr.length
- for (var i = 0,
- al = arr.length; i < al; i++) {
- var a = arr[i];
- //...
- }
这样比第一种可以略微提升点性能,要是数组长,可以提升更多。
不过这样写就多了个变量 al,且这个变量只在用来与 i 对比的时候有用,看着有点鸡肋。
如果循环顺序对你不重要,那你可以尝试倒序循环:
- for(var i = arr.length-1;i > -1;i--) {
- var a = arr[i];
- //...
- }
这样一来变量少些,且还缓存过 arr 长度,性能也不错。但这里的代码写得有点拙劣(我故意的),首先是
(居然要 - 1,靠),然后是循环继续执行的条件 i > -1,都让有洁癖的人无法忍受。
- i = arr.length-1
下面是我常用的倒序 for 循环写法:
- for(var i = arr.length;i--;) {
- var a = arr[i];
- //...
- }
这已经非常精简了。原理需要理解一下:for 循环继续执行的条件,是;; 之间的这个判断要为真,而这里的 i–,在第一次循环进来的时候,
,i–值不变(为什么不变?因为要在 for 循环体里面,才会发现 i 变了);当 i=1 时,i- - 还是 1,但进入循环体后,就是 0 了,所以可以正常执行最后一次循环;当 i=0 时,i–还是 0,而 0 已经不为真了,所以循环就不会继续执行了。
- i=arr.length
大家注意到上面的所有代码的 for 循环体里,都有个
,用来取出当前循环到的数组项。这实际上也是种浪费,且 jsLint 等会告诉你:不要在循环里声明变量。。。
- var a = arr[i]
倒序的 for 可以精简至斯,但我就是要正序,而且要效率高,变量少,怎么办?
如下:
- for (var i = 0,
- a; a = arr[i++];) {
- //...
- }
这种写法好处在于:几乎不可避免的
不见了,前面说的取出当前循环到的数组项的那一句也不见了。
- arr.length
原理:
,在这里作为循环能执行的条件,注意这里只有一个 = 号,所以这不是判断句,是赋值语句,就是把
- a = arr[i++]
赋给 a,然后判断 a 是不是真值。i++ 与 i–的原理类型我就不说了,只说当 i++ 已经超过数组的长度时,循环肯定要停止才行,而这里真的就停止了,为什么?因为
- arr[i++]
,如果取到了超出数组本身长度的项,只会取得一个 undefined,而 undefined 是假值,循环条件就判断失败了。
- a=arr[i++]
当然,这样写的缺点也很明显:
1,当 arr 的长度动态变化时,依然会产生死循环————因为我们从来没缓存过 arr.length 呀。
2,如果循环的是一个数字数组,当取出的项(即 a 的值)为 0 时,就会中止循环(因为 0 是假值)。
3,当数组中某一项是假值时(包括空字符串,0,null,undefined),同样会中止循环
所以大家用这种写法时,最好排除掉上面的情况再用。
这个原理同样可以用在倒序循环上。
最后我要忠告大家几句:
顺带说几点提高 for 循环性能的要点:
1,适时 break! 不需要遍历全部的就要加跳出条件!
2,不要在 for 循环体里声明变量(建议一次 var, 多次赋值)
2,数组长度缓存,尽量少变量
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流。
来源: http://www.phperz.com/article/17/0517/328180.html