[关闭]
@panhonhang 2018-07-19T10:10:16.000000Z 字数 1192 阅读 550

如何判断两个对象相等?


在js中的相等运算符包括"==","==="。

"==":两边值类型不同的时候,要先进行类型转换,再比较 ;
"===":不做类型转换,类型不同的一定不等。

这是基本的数据类型相等判断。

两个对象是否相等如何判断呢?

也许你会认为:“如果两个对象有相同的属性,以及它们的属性有相同的值,那么这两个对象就相等。”
请看下面这个例子:

var obj1 = {
    name: "李华",
    sex : "男"
}

var obj2 = {
    name: "李华",
    sex : "男"
}

console.log(obj1 == obj2);//输出: false

console.log(obj1 === obj2);//输出: false

为什么会出现这种情况呢?主要原因是基本类型(string,number)通过值来比较,而对象(Date,Array)及普通对象通过指针指向的内存中的地址来做比较。上述例子中obj1与obj2指向内存中的地址并不相同。如果改为下面这样:

var obj1 = {
    name: "李华",
    sex : "男"
}

var obj3 = obj1;

console.log(obj1 == obj3);//输出: true

这样的话会返回true,这是因为obj1和ob3的指针指向了内存中的同一个地址。

判断两个对象是否相等,你需要明确,你是想判断两个对象的属性相同,还是属性对应的值相同?

如果想要判断对象的值是否相等,你可以通过遍历对象的每个属性,看看它们是否相等。

function isObjectValueEqual(a, b) {

    var aObj = Object.getOwnPropertyNames(a);
    var bObj = Object.getOwnPropertyNames(b);

    if (aObj.length != bObj.length) {
        return false;
    }

    for (var i = 0; i < aObj.length; i++) {
        var propName = aObj[i];

        if (a[propName] !== b[propName]) {
            return false;
        }
    }

    return true;
}

var obj1 = {
    name: "李华",
    sex : "男"
}

var obj2 = {
    name: "李华",
    sex : "男"
}

console.log(isObjectValueEqual(obj1, obj2));//输出true

但是这种方法在许多情况下都不能处理。比如:

  1. 如果该属性值之一本身就是一个对象
  2. 如果属性值中的一个是NaN
  3. 如果一个属性的值为undefined,而另一个对象没有这个属性

在Underscore和Lo-Dash有一个名为_.isEqual()方法,可以处理深度对象的比较。

var obj1 = {
    name: "李华",
    sex : "男"
}

var obj2 = {
    name: "李华",
    sex : "男"
}

console.log(_.isEqual(obj1, obj2));//输出true
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注