# 浅比较与深比较

# 浅比较

浅比较也叫应用相等。在 js 中 === 是做浅比较,只检查两个对象是否指向同一个引用。

const a = { x: 1 }
const b = { x: 1 }
console.log(a === b) // false

此时的 a 和 b 指向不同的对象引用,打印值为 false

const a = { x: 1 }
const b = a
console.log(a === b) // true

此时的 a 和 b 指向的是同一对象的引用,打印值为 true

# 深比较

深比较会检查两个对象所有的属性是否都相等,需要用递归的方式遍历两个对象的所有属性,不管对象是不是同一对象的引用。

var deepEqual = function (x, y) {
  if (x === y) {
    return true
  }
  if (
    typeof x === 'object' &&
    x != null &&
    typeof y === 'object' &&
    y != null
  ) {
    // 属性数量不一样
    if (Object.keys(x).length !== Object.keys(y).length) {
      return false
    }

    for (let prop in x) {
      if (y.hasOwnProperty(prop)) {
        if (!deepEqual(x[prop], y[prop])) {
          return false
        }
      } else {
        return false
      }
    }

    return true
  } else {
    // 不是对象且不满足 ===,直接返回 false
    return false
  }
}
Last Updated: 3/17/2022, 5:01:11 PM