前端攻城狮学习笔记一:实现一个遍历数组或对象里所有成员的迭代器

面试题目

  这是搜狐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的用法,对数组的遍历,对对象成员的遍历等知识点。

你可能感兴趣的:(学习笔记)