题目:js类型判断

**任务
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.**

思路:
1.先判断两个数组是不是数组类型
2.再判断两个数组的长度是不是一致
3.建一个类型对象数组obj,初始化为零。

var obj={
            'number':0,
            'string':0,
            'boolean':0,
            'undefined':0,
            'null':0,
            'function':0,
            'date':0,
            'object':0,
            'window':0
                };

4.第一个数组arr1,遍历,遇到一个元素,把相应的类型在obj中加一
5.第二个数组arr2,遍历,遇到一个元素,把相应的类型在obj中减一
6.最后判断是不是obj里面所有键都值为0。

    function check(i){
        //除了function 其他的引用类型用instanceof来判定
        if(i instanceof Date){
            return 'date';
        }
        else if(i instanceof Window){
            return 'window';
        }
       // typeof可以判断基本类型(number string boolean null(typeof 返回object) undefined )和引用类型的function类型
        if(typeof i === 'number')return 'number';
        else if(typeof i === 'string')return 'string';
        else if(typeof i === 'boolean')return 'boolean';
        else if(typeof i === 'function')return 'function';
        //typeof null 返回 object
        else if(typeof i === 'object'){
            if(i === null){
                return 'null';
            }else{
                return 'object';
            }
        }
        else if(typeof i === 'undefined'){
            return 'undefined';
        }
    }
    function arraysSimilar(arr1, arr2){
        if(!arr1||!arr2){return false;}
        if(!(arr1 instanceof Array )||!(arr2 instanceof Array))return false;
        if(arr1.length!=arr2.length)return false;
        var obj={
            'number':0,
            'string':0,
            'boolean':0,
            'undefined':0,
            'null':0,
            'function':0,
            'date':0,
            'object':0,
            'window':0
                };
        for(var i=0;i<arr1.length;i++){

            var r1=check(arr1[i]);
            var r2=check(arr2[i]);
            obj[r1]++;
            obj[r2]--;
        }
        for(var o in obj){
            if(obj[o]!=0)return false;
        }
        return true;

    }

测试用例:

  var cases=[{
        arr1:[1,true,null],
        arr2:[null,false,100],
        expect:true
    },{
        arr1:[function(){},100],
        arr2:[100,{}],
        expect:false
    },{
        arr1:[null,999],
        arr2:[{},444],
        expect:false
    },{
        arr1:[window,1,true,new Date(),"hahaha",(function(){}),undefined],
        arr2:[undefined,(function(){}),"okokok",new Date(),false,2,window],
        expect:true
    },{
        arr1:[new Date()],
        arr2:[{}],
        expect:false
    },{
        arr1:[window],
        arr2:[{}],
        expect:false
    },{
        arr1:[undefined,1],
        arr2:[null,2],
        expect:false
    },{
        arr1:[new Object,new Object,new Object],
        arr2:[{},{},null],
        expect:false
    },{
        arr1:null,
        arr2:null,
        expect:false
    },{
        arr1:[],
        arr2:undefined,
        expect:false
    },{
        arr1:"abc",
        arr2:"cba",
        expect:false
    }];

    for(var i=0;i<cases.length;i++) {
        console.log(cases[i].arr1,cases[i].arr2);
        console.log(arraysSimilar(cases[i].arr1, cases[i].arr2));
        console.log(cases[i].expect);
    }

除了instanceof和typeof,用Object.prototype.toString.call(obj)和duck type(就是看有没有这个类型的固有属性,比如要判断数组,就看有没有arr.map等)来判定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值