import {
|
hasOwn
|
} from 'uni-shared'
|
|
const isArray = Array.isArray
|
const keyList = Object.keys
|
|
export default function equal (a, b) {
|
if (a === b) return true
|
|
if (a && b && typeof a === 'object' && typeof b === 'object') {
|
const arrA = isArray(a)
|
const arrB = isArray(b)
|
let i, length, key
|
if (arrA && arrB) {
|
length = a.length
|
if (length !== b.length) return false
|
for (i = length; i-- !== 0;) {
|
if (!equal(a[i], b[i])) return false
|
}
|
return true
|
}
|
if (arrA !== arrB) return false
|
|
const dateA = a instanceof Date
|
const dateB = b instanceof Date
|
if (dateA !== dateB) return false
|
if (dateA && dateB) return a.getTime() === b.getTime()
|
|
const regexpA = a instanceof RegExp
|
const regexpB = b instanceof RegExp
|
if (regexpA !== regexpB) return false
|
if (regexpA && regexpB) return a.toString() === b.toString()
|
|
const keys = keyList(a)
|
length = keys.length
|
if (length !== keyList(b).length) {
|
return false
|
}
|
for (i = length; i-- !== 0;) {
|
if (!hasOwn.call(b, keys[i])) return false
|
}
|
for (i = length; i-- !== 0;) {
|
key = keys[i]
|
if (!equal(a[key], b[key])) return false
|
}
|
|
return true
|
}
|
|
return false
|
}
|