工具函数——js对比两个任意(复杂)类型的变量是否相等

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/q95548854/article/details/100030393

/**
 * 对比两个任意类型的变量是否相等(暂不支持Function)
 * @param {*要对比的两个变量} ab
 */
export const equarComplex = (a, b) => {
  // 判断类型
  const typeA = getObjType(a)
  const typeB = getObjType(b)
  if (typeA !== typeB) {
    return false
  } else if (typeA === 'Base') {
    console.log('base', a, b)
    return a === b
  } else if (typeA === 'Array') {
    if (a.length !== b.length) {
      console.log('array', a, b)
      return false
    } else {
      // 循环遍历数组的值进行比较
      for (let i = 0; i < a.length; i++) {
        if (!equarComplex(a[i], b[i])) {
          console.log('array', a[i], b[i])
          return false
        }
      }
      return true
    }
  } else if (typeA === 'Object') {
    if (Object.keys(a).length !== Object.keys(b).length) {
      console.log('Object', a, b)
      return false
    }
    for (var o in a) {
      if (!equarComplex(a[o], b[o])) {
        console.log('Object', a[o], b[o])
        return false
      }
    }
    return true
  } else if (typeA === 'Undefined' || typeA === 'Null') {
    return true
  } else {
    console.log('Type Error')
    return false
  }
}

/**
 * 获取变量的类型
 * @param {*要获取类型的变量} obj
 */
export const getObjType = (obj) => {
  const type = Object.prototype.toString.call(obj)
  switch (type) {
    case '[object Array]':
      return 'Array'
      break
    case '[object Object]':
      return 'Object'
      break
    case '[object Function]':
      return 'Function'
      break
    case '[object Undefined]':
      return 'Undefined'
      break
    case '[object Null]':
      return 'Null'
      break
    case '[object Number]':
    case '[object String]':
    case '[object Boolean]':
      return 'Base'
      break
    default:
      return 'Error'
      break
  }
}

觉得有帮助的小伙伴右上角点个赞~

在这里插入图片描述

扫描上方二维码关注我的订阅号~

猜你喜欢

转载自blog.csdn.net/q95548854/article/details/100030393