衡阳人才招聘网站:js中遍历数组的效率问题

来源:百度文库 编辑:九乡新闻网 时间:2024/05/02 07:49:20
Java代码
  1. "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  2. "http://www.w3.org/1999/xhtml">   
  3.   
  4.     jquery   
  5.     "text/css">   
  6.     #info {   
  7.         color:#FF0000;   
  8.         height:150px;   
  9.     }   
  10.        
  11.   
  12.   
  13.     "div1">   
  14.     "5000" type="text" id="txt1"/>"button" id="btn1" value="生成 checkbox"/>   
  15.     "info">   
  16.     "button" id="btnTest1" onclick="fun1(this)" value="第一种"/>
      
  17.     "button" id="btnTest1" onclick="fun2(this)" value="第二种"/>
      
  18.     "button" id="btnTest1" onclick="fun3(this)" value="第三种"/>
      
  19.     
  
  •     "box">
  •   
  •     
  •   
  •   
  • "text/javascript">   
  • var g=function(id) {return document.getElementById(id);};   
  • g("btn1").onclick=function() {   
  •     var val=g("txt1").value-0;   
  •     if(!isNaN(val)) {   
  •         var box=g("box");   
  •         box.innerHTML="";   
  •         for(var i=0;i
  •             var chk=document.createElement("input");   
  •             chk.type="checkbox";   
  •             box.appendChild(chk);   
  •         }   
  •     }   
  •       
  • }   
  • //这里为了简单就没有判断type   
  • var fun1=function(obj) {//第一种直接在for中取数组长度   
  •     var chks=g("box").getElementsByTagName("input");   
  •     var b=!chks[0].checked;   
  •   
  •     var d=new Date();   
  •     for(var i=0;i
  •         //chks[i].checked=b;   
  •     }   
  •     obj.nextSibling.innerHTML=new Date()-d;   
  • }   
  • var fun2=function(obj) {//第二种   
  •     var chks=g("box").getElementsByTagName("input");   
  •     var b=!chks[0].checked;   
  •   
  •     var d=new Date();   
  •     for(var i=0;chks[i];i++) {   
  •         //chks[i].checked=b;   
  •     }   
  •     obj.nextSibling.innerHTML=new Date()-d;   
  • }   
  • var fun3=function(obj) {//第三种将数组的长度放到一个局部变量中   
  •     var chks=g("box").getElementsByTagName("input");   
  •     var b=!chks[0].checked;   
  •     var length=chks.length;   
  •     var d=new Date();   
  •        
  •     for(var i=0;i
  •         //chks[i].checked=b;   
  •     }   
  •     obj.nextSibling.innerHTML=new Date()-d;   
  • }   
  •   
  •   
  •  

    第一种:每次循环读取 chks 集合的属性 length;
    第二种:每次循环定位 chks[i];
    第三种:每次循环读取 变量 length。

    -----------------------------------------------

    第一种:406 ms
    第二种:16 ms
    第三种:0 ms

    --------------------------------

    第三种直接读取变量速度最快,第二种集合定位次之,第一种最慢,
    每种之间相差一个数量级。

    ----------------------------------------------------

    第一种之所以慢是因为访问集合的 length 属性时需要遍历 prototype,从而获取 length,
    这就增加了不必要的开销,因为 length 只是终止条件,并未参与实际运算。

    ----------------------------------------------------

    另,如果循环中需要多次访问 chks[i] 的话,就应该进一步优化,从而降低内部检索的开销。

    可以充分利用 js 的特性,不必读取 length,并将定位与赋值分离,优化代码如下 :

    Java代码
    1. var fun3=function(obj) {   
    2.     var chks=g("box").getElementsByTagName("input");   
    3.     var b=!chks[0].checked;   
    4.   
    5.     var d=new Date();   
    6.     for(var i=0,chk; chk=chks[i]; i++) {   
    7.         chk.checked=b;   
    8.     }   
    9.     obj.nextSibling.innerHTML=new Date()-d;   
    10. }