判断两个对象是否相等的js函数

如果两个对象属性在初始化时出现的顺序不一样 但数目及值一样,最终比较结果也是true

支持每个属性又是其他类型,如对象、数组、数字、字符串 


function equal(objA, objB){

   if (typeof arguments[0] != typeof arguments[1]){
    alert("objA type is "+typeof arguments[0]+"\n objB type is "+typeof arguments[1]+"\n not equal!");
       return false;
   }

   //数组
   if (arguments[0] instanceof Array){
    alert("they are instanceof Array!");
       if (arguments[0].length != arguments[1].length){
        alert("objA.length is "+arguments[0].length+"\n objB.length is "+arguments[1].length+"\n not equal!");
           return false;
       }
       
       var allElementsEqual = true;
       for (var i = 0; i < arguments[0].length; ++i){
           if (typeof arguments[0][i] != typeof arguments[1][i]){
            alert("objA["+i+"] type is "+typeof arguments[0][i] +"\n objB["+i+"] type is "+typeof arguments[1][i] +"\n not equal!");
               return false;
           }


           if (typeof arguments[0][i] == 'number' && typeof arguments[1][i] == 'number'){
            if(arguments[0][i] != arguments[1][i]){
          alert("objA["+i+"] and objB["+i+"] are instanceof number \n objA["+i+"] == "+arguments[0][i] +", objB["+i+"] == "+arguments[1][i] +"\n not equal!");
            }
               allElementsEqual = (arguments[0][i] == arguments[1][i]);
           }
           else
               allElementsEqual = arguments.callee(arguments[0][i], arguments[1][i]);            //递归判断对象是否相等                
       }
       return allElementsEqual;
   }
   
   //对象
   if (arguments[0] instanceof Object && arguments[1] instanceof Object)
   {
    alert("they are instanceof Object!");
       var result = true;
       var attributeLengthA = 0, attributeLengthB = 0;
       for (var o in arguments[0])
       {
           //判断两个对象的同名属性是否相同(数字或字符串)
           if (typeof arguments[0][o] == 'number' || typeof arguments[0][o] == 'string')
               result = eval("arguments[0]['" + o + "'] == arguments[1]['" + o + "']");
           else {
               //如果对象的属性也是对象,则递归判断两个对象的同名属性
               //if (!arguments.callee(arguments[0][o], arguments[1][o]))
               if (!arguments.callee(eval("arguments[0]['" + o + "']"), eval("arguments[1]['" + o + "']")))
               {
                   result = false;
                   return result;
               }
           }
           ++attributeLengthA;
       }
       
       for (var o in arguments[1]) {
           ++attributeLengthB;
       }
       
       //如果两个对象的属性数目不等,则两个对象也不等
       if (attributeLengthA != attributeLengthB)
           result = false;
       return result;
   }
   return arguments[0] == arguments[1];

}

转自 :http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2009/12/08/1619321.html

你可能感兴趣的:(判断两个对象是否相等的js函数)