搜狐面试题一

一、实现一个遍历数组或对象里所有成员的迭代器。

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

【思路分析】

1.首先判断传进来的是数组还是对象,用到instanceof,typeof和instanceof都可以用来判断js变量类型,用法区别

typeof(obj)                                         //typeof会返回一个基本数据类型

obj instanceof Array                            //instanceof一般是用来验证一个对象是否属于某类

注:typeof遇到null,数组,对象都会返回object类型

var each = function(obj, fn){
    if(obj instanceof Array){
		
    }
    else if(obj instanceof Object){
		
    }
};

2.遍历数组和遍历对象的区别

遍历数组:

for(var i=0,j=array.length;i<j;i++){

    alert(array[i]);

}

遍历对象:
for(var e in data){
    alert(data[e]);
}

3.分析结果

each(data1, function(o){
    if( 6 == this )
        return true;           //表示跳过并继续遍历
    else if( 8 == this )
        return false;          //表示停止遍历
    console.log(o + ": \"" + this + "\"");
});        

如果直接for循环,那会输出数组所有元素,现在有个each函数,应该让他指向obj中的元素(即改变this指向,让this代表obj[i])

fn.call(obj[i],i+1);                  //fn是each的第二个参数,让这个函数指向obj中的元素,第一个参数o,让让它传值i+1

仅仅这样会输出4,5,7,8,9,10,11,12,所以还需要限定让它等于8的时候跳出整个循环

if(obj instanceof Array){
    for(var i=0,j=obj.length;i<j;i++){
        var temp=fn.call(obj[i],i+1);
        if(temp===false){        //===值和类型都要等,==只是值相同null==false
            return;	
        }
    }
}

同理,遍历对象

else if(obj instanceof Object){
    for(var e in obj){
        fn.call(obj[e],obj[e],e);       //第一个参数v(对象值),第二个n(对象索引)
    }
}

注:obj instanceof Object要在obj instanceof Array之后,因为数组属于对象,Object在前面的话,后面的判断就不执行了

 

转载于:https://www.cnblogs.com/zhangwenkan/p/3968043.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值