ES6 中有一個方法判斷兩個對象是否相等,這個方法判斷是兩個對象引用地址是否一致
let obj1= {
a: 1
}
let obj2 = {
a: 1
}
console.log(Object.is(obj1, obj2)) // false
let obj3 = obj1
console.log(Object.is(obj1, obj3)) // true
console.log(Object.is(obj2, obj3)) // fals
當需求是比較兩個對象內容是否一致時就沒用了
想要比較兩個對象內容是否一致,思路是要遍歷對象的所有鍵名和鍵值是否都一致:
1、判斷兩個對象是否指向同一內存
2、使用 Object.getOwnPropertyNames 獲取對象所有鍵名數組
3、判斷兩個對象的鍵名數組是否相等
4、遍歷鍵名,判斷鍵值是否都相等
let obj1 = {
a: 1,
b: {c: 2}
}
let obj2 = {
b: {c: 3},
a: 1
}
function isObjectValueEqual(a, b) {
// 判斷兩個對象是否指向同一內存,指向同一內存返回 true
if (a === b) return true // 獲取兩個對象鍵值數組
let aProps = Object.getOwnPropertyNames(a)
let bProps = Object.getOwnPropertyNames(b)
// 判斷兩個對象鍵值數組長度是否一致,不一致返回 false
if (aProps.length !== bProps.length) return false // 遍歷對象的鍵值
for (let prop in a) {
// 判斷 a 的鍵值,在 b 中是否存在,不存在,返回 false
if (b.hasOwnProperty(prop)) {
// 判斷 a 的鍵值是否為對象,是則遞歸,不是對象直接判斷鍵值是否相等,不相等返回 false
if (typeof a[prop] === 'object') {
if (!isObjectValueEqual(a[prop], b[prop])) return false
} else if (a[prop] !== b[prop]) {
return false
}
} else {
return false
}
}
return true
}
console.log(isObjectValueEqual(obj1, obj2)) // false
