Web 技术研究所

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

JavaScript的某些内置方法请慎重使用

  之前的文章(点此查看)有说过这个问题,除了之前说的那些方法以外,JS1.6还有两个用来搜索元素的方法indexOf和lastIndexOf。
var i,s=[],l=1E7,d;
//构造数组
for(i=0;i<=l;i++)s.push(i);

//indexOf搜索
d=new Date;
s.indexOf(l);
document.write(new Date-d,"<br/>");

//普通循环搜索
d=new Date;
for(i=0;i<=l;i++)s[i]==l;
document.write(new Date-d,"<br/>");

  这里要声明一下,我的运行结果是有经过多次运行取平均值的,不要因为这是截图就觉得不是平均值。看到这个运行结果是不是很惊讶,内置函数的效率居然不如普通的循环。其实很多所谓内置函数都是骗人的,它们看似内置,其实只是一个封装了的JS而已。而且为了通用性,它们通常都会做一大堆的判断,所以有时候会感觉它们的效率很低。
  上面的测试代码测试的是一个饱和数组,也就是在数组长度内所有项都存在的数组。而对于一个不饱和数组情况就不同了 var i,s=[],l=1E7,d;
//构造数组
//这个数组只有最后一项
s[l]=l;

//indexOf搜索
d=new Date;
s.indexOf(l);
document.write(new Date-d,"<br/>");

//普通循环搜索
d=new Date;
for(i=0;i<=l;i++)s[i]==l;
document.write(new Date-d,"<br/>");
  这个程序的运行结果我就不贴出来了,总之就是indexOf方法瞬间得出结果,循环的方法则非常慢。JavaScript中允许不饱和数组存在,所以在不知道数组是否是饱和的情况下就去盲目的遍历肯定是不行的。第一个例子中是饱和数组,这是我们预先知道的信息,所以直接使用循环的方法就省去一大堆麻烦的计算和判断。即使使用indexOf它最终也是使用循环,只不过在那之前会做很多处理,浪费了时间而已。
  知道了这些,我们在开发的时候就可以主动的为数组选择最合适的方法来操作。不仅是indexOf,同样的情况在JS1.6的其它几个方法中也适用,因为它们的内部算法都是大同小异的。最后可以总结成一句:不要盲目依赖内置方法
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^