欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js对象比较

程序员文章站 2023-12-24 16:29:09
...

在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类型,或者数组等(即对象类型),我们再采用递归的方式来重复调用自己来做判断。这好像也行。但这样做是不是有点把问题搞复杂了,有么有更好的思路或者方法来解决这个问题呢?

上一篇:

下一篇: