vue2 源码笔记 判断2个对象是否相等

119 阅读1分钟
export function looseEqual (a: any, b: any): boolean {
  if (a === b) return true
  const isObjectA = isObject(a)
  const isObjectB = isObject(b)
  if (isObjectA && isObjectB) {//先判断是否是对象 是对象
    try {
      const isArrayA = Array.isArray(a)
      const isArrayB = Array.isArray(b)
      if (isArrayA && isArrayB) {//是不是数组
        return a.length === b.length && a.every((e, i) => {//比较长度,长度相等,则比较每个值是否在另一个数组里
          return looseEqual(e, b[i])
        })
      } else if (a instanceof Date && b instanceof Date) {//比较时间
        return a.getTime() === b.getTime()
      } else if (!isArrayA && !isArrayB) {
        const keysA = Object.keys(a)
        const keysB = Object.keys(b)
        return keysA.length === keysB.length && keysA.every(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
  }
}