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

面试题目

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

posted @   草根程序猿  阅读(2274)  评论(6编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示