Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript几种循环和数组操作的效率

  首先,是普通的循环。运行这个代码就能得到答案。 var MAX=1E8;

var i,t,a,b;

i=MAX;
t=new Date;
while(i--);
a="while:"+(new Date-t);

i=MAX;
t=new Date;
do{}while(i--);
b="do:"+(new Date-t);

t=new Date;
for(i=0;i<MAX;i++);
c="for:"+(new Date-t);

alert(a+"\n"+b+"\n"+c);

  IE中for循环的效率是最低的,和while相差一倍。Chrome中他们相差的不是很多,但是还是可以明显的看出while的效率最高。在firefox中三种循环几乎么有什么差别,但是多测试几次就会发现for循环的效率略高与其它。虽然火狐有点奇葩,但是在程序中需要用到高效率的代码时建议使用while循环。
  接着数组操作的效率。先测试写入的效率。用下面代码
var MAX=1E7;

var i,s,t,a,b,c;

s=[];
t=new Date;
for(i=0;i<MAX;i++)s.push(i);
a="push:"+(new Date-t);

s=[];
t=new Date;
for(i=0;i<MAX;i++)s[i]=i;
b="[i]:"+(new Date-t);

//倒序写入
s=[];
t=new Date;
for(i=MAX-1;i>=0;i--)s[i]=i;
c="[MAX-i]:"+(new Date-t);

alert(a+"\n"+b+"\n"+c);

  push和直接使用索引比起来会快一些。使用索引写入数据还和顺序有关,这是数据结构搞的鬼。正常倒序写入会比顺序写入的速度慢一倍,火狐这无节操的货不知用了什么奇葩的数据结构,导致了倒序比顺序慢了十倍。所以写入数组时我推荐使用push,坚决避免倒序写入。
  说完写入,然后就是遍历了。下面是测试代码 var MAX=1E7;

var i,s,l,t,a,b,c;

//创建数组
i=MAX,s=[];
while(i--)s.push(i);

t=new Date;
for(i=0;i<s.length;i++);
a="for1:"+(new Date-t);

t=new Date;
for(i=0,l=s.length;i<l;i++);
b="for2:"+(new Date-t);

t=new Date;
for(i in s);
c="for in:"+(new Date-t);

alert(a+"\n"+b+"\n"+c);

  前两种for循环从代码的感觉上第二种效率是很低的,但是事实并不是那样。无论有没有把数组长度单独放入变量中,效率都是差不多的。最消耗效率的遍历方法是第三种。for in的效率比正常的for循环要地几十上百倍了,所以如果没有特殊需求,在遍历数组时应该使用前两种方式。推荐使用第二种,虽然遍历普通数组时效率相差不大。但是,如果遍历某种拟数组对象的话,length属性有可能被做成Getter属性,那就会严重影响效率。所以养成好习惯,把length提取出来再做遍历。
  最后再介绍一种遍历方式,也是我很喜欢用的,虽然效率不是最高的,但是用起来很方便。 var MAX=1E7;

var i,s,o,t;

//创建数组
i=MAX,s=[];
while(--i)s.push(i);

i=0;
t=new Date;
while(o=s[i++]);
t=new Date-t;

alert(t);
  这个方法最大的优点就是可以直接取到数组的键值而不是键名,但是这就必须保证数据中不存在空元素或者0元素,否则循环会中断。用它来遍历DOM对象是一个很好的选择。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^