SOURCE

const hasOwn = Object.prototype.hasOwnProperty

// 由于 == 操作符会自动将 0, 空字符串,null,undefined 转成 false
// 并且 === 在判断 +0和-0 NaN和NaN 时也会出现结果不符合预期的问题
// 因此使用Object.is()
// 该方法相当于 Object.is() 的 polyfill, 
function is(x, y) {
  if (x === y) {
    return x !== 0 || y !== 0 || 1 / x === 1 / y
  } else {
    return x !== x && y !== y
  }
}

function shallowEqual(objA, objB) {
  // 先进行基本数据类型的比较
  if (is(objA, objB)) return true
  // 排除掉除了两个都是对象外的其他情况
  if (typeof objA !== 'object' || objA === null ||
      typeof objB !== 'object' || objB === null) {
    return false
  }

  // 对对象的比较
  const keysA = Object.keys(objA)
  const keysB = Object.keys(objB)

  // 长度不等直接返回 false
  if (keysA.length !== keysB.length) return false
  // 在 key 长的相等的情况下再去循环比较
  for (let i = 0; i < keysA.length; i++) {
    const k = keysA[i]
    if (!hasOwn.call(objB, k) || !is(objA[k], objB[k])) {
      return false
    }
  }
  return true
}

const a = {a: 1, b: '3', c: 3}
const b = {a: 1, b: 2, c: 3}
console.log(shallowEqual(a, b))
console 命令行工具 X clear

                    
>
console