js-“比较2个基本数据类型的变量是否相等”及“浅比较”

我们在js中校验2个基本数据类型的变量是否相等时,一般就直接用a === b来做判断了,但是这种写法其实是不严谨的。具体为什么呢,看看下面的几个表达式:

js-“比较2个基本数据类型的变量是否相等”及“浅比较”_第1张图片
js基本数据类型比较.png
意外的表达式
  • +0 === -0
js中打印为true,我们期望是false
  • NaN === NaN
js中打印为false,我们期望是true
如何解决呢?
解决+0 === -0 为true,我们可以通过:
  1/(+0)结果为Infinity,
  1/(-0)结果为-Infinity
  而Infinity === -Infinity为false。
所以当a === b时,且1 / x === 1 / y,则可以排除+0和-0的问题。
解决 NaN === NaN为false,我们可以通过:
  NaN和自身不相等的特性来解决,即:
  a !==b && a !== a && b !== b时,确定这两个数是NaN。
下面就是比较2个基本数据类型的变量是否相等的方法:
function is(x, y) {
  if (x === y) {
    //排除 +0 == -0
    return x !== 0 || y !== 0 || 1 / x === 1 / y;
  } else {
    return x !== x && y !== y;
  }
}
利用上面的比较基本数据类型的方法,我们可以很容易的写出任意2个对象的浅比较
function shallowEqual(objA, objB) {
  if (is(objA, objB)) {
    return true;
  }

  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
    return false;
  }

  var keysA = Object.keys(objA);
  var keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) {
    return false;
  }

  for (var i = 0; i < keysA.length; i++) {
    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
      return false;
    }
  }

  return true;
}
希望对你有帮助~

你可能感兴趣的:(js-“比较2个基本数据类型的变量是否相等”及“浅比较”)