我在看了http://topic.csdn.net/u/20091030/23/1D7B29B3-65F4-4FE7-B618-882A1910034A.html此帖后,
看到14楼的 yixianggao的回复后,<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Untitled Document</title>
    </head>
    <body onload="fun();">
    
    </body></html>    <script type="text/javascript">
     function fun(){
     var temp = new Array(1,1,2,4,4,1,2,1,1,21); var str = "";
        for (var i = 0,item; item = temp[i]; i++){
str = str + item +"------------";
alert(str);
}
        document.write(str);
        }
        
        
    </script>
// 这样能打印出来结果<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Untitled Document</title>
    </head>
    <body onload="fun();">
    
    </body></html>    <script type="text/javascript">
     function fun(){
     var temp = new Array();
var length = temp.length;
var item ;
        for(var i = 0; i < length; i++){
         temp[i] = i;
        }
var str = "";
        for (var i = 0,item; item = temp[i]; i++){
str = str + item +"----------------";
alert(str);
}
        document.write(str);
        }
        
        
    </script>// 这样打印出来的结果是空的 
 // 听那个14楼yixianggao的说是,JS的特性 [可以充分利用 js 的特性,不必读取 length,并将定位与赋值分离]
那我一个初始化时赋值, 一个初始化后再赋值,为什么会有区别呢,请教大家了 

解决方案 »

  1.   

    14楼的改成这样,你的数组 是空的<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>js中for遍历数组的效率</title>
        <style type="text/css">
    #info {
    color:#FF0000;
    height:150px;
    }
        </style>
    </head>
    <body>
    <div id="div1">
    <input value="5000" type="text" id="txt1"/><input type="button" id="btn1" value="生成 checkbox"/>
    <div id="info">
    <input type="button" id="btnTest1" onclick="fun1(this)" value="第一种"/><span></span><br/>
    <input type="button" id="btnTest2" onclick="fun2(this)" value="第二种"/><span></span><br/>
    <input type="button" id="btnTest3" onclick="fun3(this)" value="第三种"/><span></span><br/>
    </div>
    <div id="box"></div>
    </div>
    </body>
    <script type="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<val;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.length;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,chk;chk=chks[i];i++) {//跟第三种一样效率
    chk.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<length;i++) {
    chks[i].checked=b;
    }
    obj.nextSibling.innerHTML=new Date()-d;
    }
    </script>
    </html>
      

  2.   

    我代码发错了<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
            <title>Untitled Document</title>
        </head>
        <body onload="fun();">
            
        </body></html>    <script type="text/javascript">
            function fun(){
                var temp = new Array(10); // 初始化10个元素 发的时候一不小心漏了 
                var length = temp.length;
                var item ;
                for(var i = 0; i < length; i++){  /* 这边是加数据啊 */
                    temp[i] = i;
                }
                var str = "";    
                for (var i = 0,item; item = temp[i]; i++){
                    str = str + item +"----------------";
                    alert(str);
                }
                document.write(str);
               }
                    
                
        </script> 
      

  3.   

    丫的,ls的代码测试了半天 ,
    1,script标签放到body后,html前
    2.temp[0]=0;转化为bool为false,所以for循环一次也没执行,最好不要用第二种
      

  4.   


    关注中,不太明白temp[0]=0;转化为bool为false..? 基础不好,嘿嘿
      

  5.   

    for (var i = 0,item; item = temp[i]; i++)
    这一句循环的条件是item=temp[i],如果索引超出界限,temp[i]应该是undefined,然后转化为bool时就为false,循环就不会执行了,工作正常
    但是他这个数组 是0开始 的,temp[0]=0;转化为bool也为false,循环没有执行网址中的例子checkbox数组,所以可以判断 
    ps:
    for执行时,执行初始化语句,并判断第二个分号前的表达式是否为真,为真则执行for内语句 ,然后再执行第二个分号后,再判断第二个分号前的表达式
      

  6.   

    呵呵, 我也没有想到用 temp[0] = 0 在判断的时候就为false其实只要在temp数组中有一个值为0,则循环到此结束吧,哈哈,不好意思了,辛苦了,辛苦了....提的二点建议 ,我会记下的.谢了 ... 
      

  7.   

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
            <title>Untitled Document</title>
        </head>
        <body onload="fun();">
            
        </body>    <script type="text/javascript">
            function fun(){
                var temp = new Array(0,1,2,4,4,1,2,1,1,21);            var str = "";    
                for (var i = 0,item; ((item = temp[i])==undefined?false:true); i++){
                    str = str + item +"------------";
                    alert(str);
                }
                document.write(str);
               }
        </script></html>整理一下,这样还行? 
      

  8.   

    谢谢啦,这下清楚了. 又学了一招~
    1.for (var i = 0,item; item = temp[i]; i++)这种方式循环,如果数组中有一个值为0,则会退出循环。不太保险啊,这种方式写循环。