JS 형식 검사

5314 단어
JS 판단 유형
1. typeof
기본 형식 과 function 검 측 에 적합 합 니 다. null 에 실 패 했 습 니 다.
2. instanceof
사용자 정의 대상 에 적합 하 며, 원생 대상 을 검사 하 는 데 도 사용 할 수 있 으 며, 서로 다른 window 및 iframe 간 검 측 시 효력 을 잃 을 수 있 습 니 다. 
3. Object.prototype.toString.apply()
내 장 된 대상 과 기본 요소 에 적합 합 니 다. null 과 undefined 가 실 효 됩 니 다.
/ / Object. prototype. toString. apply (null) 는 IE6 / 7 / 8 에서 "[object Object]" 를 되 돌려 줍 니 다.
4. constructor
5. duck type
<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb18030">
    <title>Untitled Document</title>
    
</head>
<body>
    <script type="text/javascript">   
        function getType(obj) {
            var retType ;
            if(null === obj) {
                retType = 'null';
            } else if('object' === typeof obj) {
                //String/Boolean/Number/Date/window
                var typeStr = Object.prototype.toString.apply(obj);
                retType = typeStr.substring(8, typeStr.length - 1);
            } else {
                retType = typeof obj;
            }
            
            return retType.toUpperCase();
        }
        /*
         * param1 Array 
         * param2 Array
         * return true or false
         */
        function judgeArrayWithoutOrder(arr1, arr2) {
            var len1 = arr1.length,
                len2 = arr2.length;
            if(len1 != len2) return false;
            
            var markArr = [];
            for(var i = 0; i < len1; i ++){
                markArr.push(true);
            }
            var sameCount = 0;
            for(var i = 0; i < len1; i ++){
                var arr1Itr = arr1[i];
                for(var j = 0; j < len1; j ++){
                    if(markArr[j]) {
                        if(arr1Itr == arr2[j]) {
                            markArr[j] = false;
                            sameCount ++;
                            break;
                        }
                    }
                }
            }
            return sameCount == len1;
        }
        /*
         * param1 Array 
         * param2 Array
         * return true or false
         */
        function arraysSimilar(arr1, arr2){
            if('ARRAY' != getType(arr1) || 'ARRAY' != getType(arr2)) {
                return false;
            }
            var len1 = arr1.length,
                len2 = arr2.length;
            if(len1 != len2) return false;
            
            var arr1Types = [],
                arr2Types = [];
            
            for(var i = 0; i < len1; i ++) {
                arr1Types.push(getType(arr1[i]));
                arr2Types.push(getType(arr2[i]));
            }
            return judgeArrayWithoutOrder(arr1Types, arr2Types);
        }
    </script>
    <script src="testData.js"></script>
</body>
</html>

TestData.js
var result=function(){
    //         
            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  ,   arraysSimilar            ,     “  ”,  "   ",       arraysSimilar  ,    ,      。    
            for(var i=0;i<cases.length;i++){
                if(arraysSimilar(cases[i].arr1,cases[i].arr2)!==cases[i].expect) {
                    document.write("   !case"+(i+1)+"   !arr1="+JSON.stringify(cases[i].arr1)+", arr2="+JSON.stringify(cases[i].arr2)+"        "+cases[i].expect);
                    return false;
                }                
            }
            return true;
            
        }();
    document.write("    :"+(result?"  ":"   "));

좋은 웹페이지 즐겨찾기