zoukankan      html  css  js  c++  java
  • js 判断对象相等

        文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个兴趣了。平常遇到问题可能就和周围的同事讨论下,然后就是发发贴 ,看有什么解决方案么,但这种情况不是很理想,提出的问题不知道是别人没看懂,还是我没表述清楚,发出去的问题就像肉包子打狗一样,没有了下文。下面进入今天的主题吧。

        在js 判断相等常见的就是 == (等同)和===(恒等); 
        ==, 两边值类型不同的时候,要先进行类型转换,再比较 ;
        ===,不做类型转换,类型不同的一定不等。      

       例:
        var a = 3;
        var b = "3"; 
        a==b 返回 true
        a===b 返回 false 
       这个是基本类型相等的判断。

       如果是对象的判断,那又会出现什么情况呢?

     var People = function (id, name) {
             
      
    this.id = id;
              
     
    this.name = name;
        
        }

    var a = new People("3","小肖"); var b = new People("3","小肖"); var c = a; console.log("对象相等判断:"+ (a==b));//false console.log("对象相等判断:"+ (a==c));// true console.log("对象相等判断:"+ (b==c)); //false
    console.log("对象相等判断:"+ (a===c));// true

         对象都是按地址进行传递的, 这里我就自认为他们对象和java,C#一样比的对象的地址是否相等?在java中我们比较两个对象的值是否相等使用的是equal的方式,最终比的是对象的hashcode 是否相等,如果相等就可判断两个对象时等同的。在js中没有这样的函数,自然想起能否自己写一个通用的函数来做判断,自然想到如下方法:

      var People = function (id, name) {
                this.id = id;
                this.name = name;
            }
    
            People.prototype.equal = function (obj) {
                if (obj instanceof People) {
                    var result = true;
                    for (k in this) {
                        if (this[k] != obj[k]) {
                            result = false;
                            break;
                        }
                    }
                    return result;
                } else {
                    return false;
                }
            }
            var a = new People("3", "小肖");
            var b = new People("3", "小肖");
            var c = a;
    
            console.log("对象相等判断a equal b:" + (a.equal(b))); //true

       好像现在能满足我的要求了,但是这只是在最一般情况下。如我对 a 或者b 进行简单的修改

           a.value = 98; //对a 对象添加一个值,在java对象中显然不能这么做,但js中这样做不推荐,但并不排除 有人不这么干。
            console.log("对象相等判断a equal b:" + (a.equal(b))); //false
            delete a.value;
            b.value = 98;
            console.log("对象相等判断a equal b:" + (a.equal(b))); //true
    

     在这种情况也许最简单的方式那 检查两个属性的长度是否相等就可以解决问题了,这样是可以解决问题,但是又有情况又出现了,请看

        var People = function (id, name, arr) {
                this.id = id;
                this.name = name;
                this.group = arr;
            }
    
            People.prototype.equal = function (obj) {
                if (obj instanceof People) {
                    var result = true;
                    for (k in this) {
                        if (this[k] != obj[k]) {
                            result = false;
                            break;
                        }
                    }
                    return result;
                } else {
                    return false;
                }
            }
            var a = new People("3", "小肖", [1, 2]);
            var b = new People("3", "小肖", [1, 2]);
            console.log("对象相等判断a equal b:" + (a.equal(b))); //false

        当对象的字段 不是基本类型,而是对象,这个时候又不相等了。本来值是相等的,我们期待的结果是返回true。这个时候可能又会想到的解决方案是我们再进行类型判断。
    如果是Object类型,或者数组等(即对象类型),我们再采用递归的方式来重复调用自己来做判断。这好像也行。但这样做是不是有点把问题搞复杂了,有么有更好的思路或者方法来解决这个问题呢?

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/stell/p/3162142.html
Copyright © 2011-2022 走看看