前端攻城獅學習筆記一:實現一個遍歷數組或對象里所有成員的迭代器


面試題目

  這是搜狐JavaScript面試題,要求如下:

  實現一個遍歷數組或對象里所有成員的迭代器。

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);
}

 

分析過程

  分析如下:

  要遍歷數組或對象成員,因此要對傳入對象進行判斷:

if(obj instanceof Array){

}
else if(obj instanceof Object){

}
else{

}

  當傳入的是Array對象時,從調用和輸出可以看出,要用到call方法,並且第一個參數為數組的值,第二個參數為元素索引(從1開始),並且當返回值為false時,結束此過程。所以代碼如下:

        if(obj instanceof Array){
            for(var i=0,l=obj.length;i<l;i++){
                var temp=fn.call(obj[i],i+1);
                if(temp === false){
                    return;
                }
            }
        }

  當傳入的是一個對象時,要對對象成員進行遍歷,並且要傳入三個參數,第一個和第二個為成員值,第三個為成員名稱。所以代碼如下:

        else if(obj instanceof Object){
            for(var e in obj){
                fn.call(obj[e],obj[e],e);
            }
        }

  最后完整代碼如下:

var each = function(obj, fn){
        //+++++++++++答題區域+++++++++++
        if(obj instanceof Array){
            for(var i=0,l=obj.length;i<l;i++){
                var temp=fn.call(obj[i],i+1);
                if(temp === false){
                    return;
                }
            }
        }
        else if(obj instanceof Object){
            for(var e in obj){
                fn.call(obj[e],obj[e],e);
            }
        }
        else{
        }
        //+++++++++++答題結束+++++++++++
};

小結

  本面試題主要考查了 instanceof 的用法,call的用法,對數組的遍歷,對對象成員的遍歷等知識點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM