
比較方法
使用 == 或 === 對兩個不同卻具有相同屬性及屬性值的物件進行比較,他們的結果卻不會相等,這是因為等號比較的是他們的參考(記憶體地址),而不是基本型別
為了測驗兩個物件在結構上是否相等,需要一個輔助函式, 他將遍歷每個物件的所有屬性,然后測驗他們是否具有相同的值,嵌套物件也需如此,當然,也可以使用引數來控制是否對原型鏈進行比較
注意:此代碼只對普通物件、陣列、函式、日期和基本型別的資料結構進行對比
function isDeepEqual(obj1, obj2, testPrototypes = false) {
if (obj1 === obj2) {
return true
}
if (typeof obj1 === 'function' && typeof obj2 === 'function') {
return obj1.toString() === obj2.toString()
}
if (obj1 instanceof Date && obj2 instanceof Date) {
return obj1.getTime() === obj2.getTime()
}
if (Object.prototype.toString.call(obj1) !== Object.prototype.toString.call(obj2) && typeof obj1 !== 'object') {
return false
}
const newB = testPrototypes ? isDeepEqual(Object.getPrototypeOf(obj1), Object.getPrototypeOf(obj2), true) : true
const obj1Props = Object.getOwnPropertyNames(obj1)
const obj2Props = Object.getOwnPropertyNames(obj2)
return (
obj1Props.length === obj2Props.length && newB && obj1Props.every(item => isDeepEqual(obj1[item], obj2[item]))
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/293751.html
標籤:其他
