两个数组是否 "相等" || 两个对象是否 "相等"

以下内容,部分来源于网上,并整理补充后的。如有问题,请指出,谢谢。

问题: var a = [ 1 , 2 , 3];

            var b = [ 1 , 2 , 3];       

            console.log(a==b);   结果是false

            但是二者内容是相同的,所以二者又是"相等",以下方法就是来判断二者"相等"。

 

方法1:  转String类型,再比较

   JSON.stringify(a1) == JSON.stringify(a2)   或    a1.toString() == a2.toString()

   该方法在某些情况下是可行的,但是数据类型会改变,如 number 被转换成 string ,数字1和字符串“1”会被认为相等。

 

 方法2: 对原型添加方法compare,实现比较

 

    Object.prototype.compare = compareObj;

    Array.prototype.compare = compareArray;

    function compareArray(arr){
        if(!arr || !arr.push) return false
        if(arr.length != this.length) return false
        for(var i = 0; i< arr.length; i++){
          if(this[i] instanceof Array && arr[i] instanceof Array){ 
            if(!this[i].compare(arr[i])) return false
            
          }else if(this[i] instanceof Object && arr[i] instanceof Object){ 
            if(!this[i].compare(arr[i])) return false
            
          }else if(this[i] !== arr[i]){
            return false
          }
        }
        return true
      }

    function compareObj(obj){
        
        if(!obj || (typeof obj) != 'object') return false
        if(Object.keys(this).length != Object.keys(obj).length) return false

        for(keyName in this){ //for in会把原型链的属性和方法也拿到, 所以用hasOwnProperty 过滤
          if(this.hasOwnProperty(keyName) != obj.hasOwnProperty(keyName)){
            return false;
          }

          if((typeof this[keyName]) != (typeof obj[keyName])){ //属性值类型不同 
            return false
          }

          if(!this.hasOwnProperty(keyName)) continue; //如果属性是原型链的,则跳过本次循环

          if(this[keyName] instanceof Array && obj[keyName] instanceof Array){ //属性值是个数组
            if(!this[keyName].compare(obj[keyName])) return false
            
          }else if(this[keyName] instanceof Object && obj[keyName] instanceof Object){ //属性值是个对象
            if(!this[keyName].compare(obj[keyName])) return false
            
          }else{
            if(this[keyName] != obj[keyName]) return false
          }
        }
        return true
      }

测试:
      var obj = { 
        a: 1, 
        b: { }, 
        c: { 
          d: [1,2,{ e: 1, f:{}}]
        }
      }
      var res = obj.compare({ a: 1, b: { }, c:{ d:[1,2,{e:1,f:{ }}]}})

      console.log(res) //true

 

方法2还是有些缺点,有空再完善。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(js)