由于對(duì)象是引用類型,即使內(nèi)容一摸一樣的兩個(gè)對(duì)象,判斷他們是否相等也是不等的,他們是存在不同地址中的相同內(nèi)容,是不相等的;只有通過賦值,兩個(gè)對(duì)象指向的是同一個(gè)地址,同一個(gè)內(nèi)容,這樣才相等。

image.png
那js中判斷對(duì)象是否相等的方法有哪些呢?
- JSON.stringify()
首先,我們可以通過將對(duì)象通過JSON.stringify()方法將對(duì)象轉(zhuǎn)換成字符串,然后再比較
局限性:
如果對(duì)象里屬性的位置發(fā)生變化,轉(zhuǎn)換來的字符串就不相等,但實(shí)際我們只需要看他們的內(nèi)容是否一致,與順序沒有關(guān)系,所以這種方法有局限性。 - 通用方法:
function equals(x,y){
var f1=x instanceof Object;
var f2=y instanceof Object;
if(!f1 || !f2){
return x===y
}
if(Object.keys(x).length!== Object.keys(y).length){
return false
}
for(var p in x){
var a= x[p] instanceof Object;
var b= y[p] instanceof Object;
if(a && b){
equals(x[p],y[p])
}else if(x[p]!=y[p]){
return false;
}
}
return true;
}
console.log(equals({a:1,b:2},{a:1,b:{c:4}}))
首先判斷是不是引用類型的,如果有一個(gè)不是,那就進(jìn)行直接判斷。
若全是引用類型的,那就先看一下屬性值的長度是否相等,若不相等,就直接false啦。
若相等,就接著遍歷里邊的每一個(gè)屬性,還是先看里邊的屬性是哪一個(gè)類型,如果全是引用類型,那就接著對(duì)里邊的屬性調(diào)用equals遞歸函數(shù)。如果不全是引用類型,那就比較這兩個(gè)值是否相等,若不相等就直接false啦。
若遍歷一圈下來都沒有返回false,說明都相等啦。所以返回true。
注意,最好不要用forin循環(huán),因?yàn)樗麜?huì)遍歷原型鏈所有的可枚舉屬性,而
function equals(x,y){
var f1=x instanceof Object;
var f2=y instanceof Object;
if(!f1 || !f2){
return x===y
}
if(Object.keys(x).length!== Object.keys(y).length){
return false
}
Object.keys(x).forEach((p)=>{
var a= x[p] instanceof Object;
var b= y[p] instanceof Object;
console.log(y[p])
if(a && b){
equals(x[p],y[p])
}else if(x[p]!=y[p]){
return false;
}
})
return true;
}
但是forEach里的return不會(huì)終止循環(huán),所以還是不用forEach了,
function equals(x, y) {
var f1 = x instanceof Object;
var f2 = y instanceof Object;
if (!f1 || !f2) {
return x === y
}
if (Object.keys(x).length !== Object.keys(y).length) {
return false
}
var newX = Object.keys(x);
for (var p in newX) {
p = newX[p];
var a = x[p] instanceof Object;
var b = y[p] instanceof Object;
if (a && b) {
equals(x[p], y[p])
} else if (x[p] != y[p]) {
return false;
}
}
return true;
}
console.log(equals({ a: 1, b: 2 }, { a: 1, d: 2 }))