Object.is浅比较

    0

判断2个值是否是同一个值

==

存在隐式类型转换,undefined,null,'',0转化为false

===

存在2个缺点 +0===-0//true NAN===NAN//false

ES5实现

js
function ObjectIs(x, y) { if (x === y) { //如果 x !== 0,则返回true // -0 +0 return x !== 0 || 1 / x === 1 / y; } else { // NaN return x !== x && y !== y; } }

React里的浅比较

比较对象相等

https://github.com/lessfish/underscore-analysis/blob/master/underscore-1.8.3.js/src/underscore-1.8.3.js#L1094-L1190

比较数组相等

function shallowEqual(objA: mixed, objB: mixed): boolean {
  //判断objA和objB是否相等,相等直接返回true
  if (is(objA, objB)) {
    return true;
  }
  /*
  	如果不相等,那么就要看下两参数是否是对象(Object.is只能对基本类型数据做比较精准的比较)。
  	浅比较需要进入到对象的第一层,不能仅引用不一样就直接返回false。
  	此外,如果两者有一个参数为null,那也不用继续下去了,两者已经不相等了,并且有一个为null,则
  	表示肯定有变化发生了,shallowEqual可以直接返回false
  */
  if (
    typeof objA !== 'object' ||
    objA === null ||
    typeof objB !== 'object' ||
    objB === null
  ) {
    return false;
  }
  //如果是对象,同时两者又没有null,则开始进入到对象的第一层来比较
  //获取两个对象的key值组成数组
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);
  //如果属性长度都不一样,则表示两者不相等,返回false
  if (keysA.length !== keysB.length) {
    return false;
  }

  //接下来一个属性一个属性的比较
  //如果objA的属性objB没有,或者两者同一个属性的值不相等,则表示objA和objB不相等,返回false
  for (let i = 0; i < keysA.length; i++) {
    if (
      !hasOwnProperty.call(objB, keysA[i]) ||
      !is(objA[keysA[i]], objB[keysA[i]])
    ) {
      return false;
    }
  }

  return true;
}

参考链接

评论区

共有评论 0

暂无评论