判断两个对象是否相等
对象引用类型不能像字符串,数字,布尔值那样 ===去判断
借用vue源码中looseEqual 方法,比较大团队写的好 两个对象分别对比,遇到引用类型再次递归对比,而不是简单的JSON.stringfiy()去做比较,这样会出现报错情况
举例: a:{name:'小明',age:20}
b:{name:'小明',age:20}
a对象中一次遍历name和age与b对象中name和age对比,然后再用b对象中name和age与a对象中name和age对比 都一致时候才判断相等
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}