zoukankan      html  css  js  c++  java
  • 前端攻城狮学习笔记一:实现一个遍历数组或对象里所有成员的迭代器

    面试题目

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

  • 相关阅读:
    Thinkphp M方法出错,D方法却可以
    Composer项目安装依赖包
    wamp httpd-vhosts.conf
    博客园报错 Mixed Content: The page at 'https://i.cnblogs.com/EditPosts.aspx?opt=1' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://upload.cnblogs.com/imageuploa
    Thinkphp js、css压缩类minify
    Thinkphp 不足之处
    Thinkphp 调试方法
    Lavavel 程序报错 MassAssignmentException in Model.php line 452: _token
    Laravel 安装mysql、表增加模拟数据、生成控制器
    Laravel 安装登录模块
  • 原文地址:https://www.cnblogs.com/jscode/p/2576322.html
Copyright © 2011-2022 走看看