JS筆試題分析(1)

要求:
一、只能在指定的位置填寫本身的代碼,本文件裏的其餘代碼不能修改
二、全部題目都不容許添加全局變量名
三、本文件應該能在firebug的console里正常執行,並輸出結果
四、代碼最優化,效率最高
五、代碼註釋明確json

var each = function(obj,fn){
       //答題開始
    
       //答題結束
}   
try{
        var data1 = [4,5,6,7,8,9,10,11,12];
        var data2 = {
                "a": 4,
                "b": 5,
                "c": 6
        };
        console.group(data1);
        
        each(data1, function(o){
            if( 6 == this )
                return true;
            else if( 8 == this )
                return false;
            console.log(o + ": \"" + this + "\"");
        });
        console.groupEnd();
        /*------[執行結果]------
        1: "4"
        2: "5"
        4: "7"
        ------------------*/
        console.group(data2);
        each(data2, function(v, n){
                if( 5 == this )
                        return true;
                console.log(n + ": \"" + v + "\"");
        });
        console.groupEnd();
        /*------[執行結果]------
        a: "4"
        c: "6"
        ------------------*/
}catch(e){
        console.error("執行出錯,錯誤信息: " + e);
}

今天就來解決而且講解下上面這道題數組

var each = function(obj,fn){
    for(var key in obj){
    /*首先遍歷下函數的一個參數obj,也就是data1和data2.爲何要選擇for,in循環呢?由於它既能遍歷數組data1,又能遍歷字典(json)data2.*/
        var value = obj[key];
    /*這邊要了解到value,key分別是什麼東西。在data1傳入的時候value是數組中各個元素,key是數組的索引。在data2傳入的時候value是值(4,5,6),key是屬性(a,b,c).*/
        fn1 = fn.bind(value);
    /*這行代碼爲了第一道題所建立.根據題目console.log(o + ":" \"" + this + "\"");但願輸出的是1:"4"  2:"5" 4:"7"; 從題目輸出的要求能夠看出前面是數組的索引值,雖然對應的值好像總體少了1.還能夠看出o對應索引,this對應數組的元素.由於o能直接獲取到(key),this的話須要添加data1才能獲取到,所以咱們用了bind()函數,bind函數第一個參數就是添加元素到指定函數裏,指向**this**.把value添加到fn裏面而後賦值給fn1.*/
        if(!isNaN(key)){
        /*若是key是數字的話,執行如下代碼*/
            var r = fn1(++key);
            /*這裏的fn1就是上面代碼中fn綁定value(data1數組元素)後的函數,函數裏面傳了個參數++key。咱們都知道key是索引,可是爲何要前面寫上++呢,細心的朋友發現了,由於答案的索引值比實際索引值要多1.代碼到這邊,輸出下r試試,r會把全部的索引值和對應的data1元素都給輸出,還能發現除了數組元素6是返回true和8是返回false,其餘都是undefined.*/
               if(r === false){                 
                break;
            /*由於想要執行結果爲1:"4" 2:"5" 4:"7",也就是不要包括數組元素8和對應的索引值+1後面的值.根據已有的代碼當數組元素是8時返回false,只要當r恆等於false就中止後面的輸出.這邊已是知足第一題的答案要求了,那爲何數組元素少了個6呢,細心的朋友已經發現了,由於當數組元素等於6時,直接返回true了.*/
            }    
         }
        else{
        /*若是key不是數字,執行下面這段代碼.*/
           fn1(value,key);
           /*看console.log(n + ": \"" + v + "\""),想要執行的結果爲a:"4",c:"6".左邊的屬性即是key,對應參數n.右邊的屬性值即是value,對應參數v.直接調用傳入參數就行了.*/
        };
    }
}
相關文章
相關標籤/搜索