食無魚
open main menu

Js相等剖析

/ 2 min read

相等判定

MDN-equal

四种算法,三种运算

  1. IsLooselyEqual, 即 == 宽松相等. [类型转换,特殊处理(NaN, -0, +0)]
  2. IsStrictlyEqual, 即 === 严格相等. [特殊处理(NaN, -0, +0)]
  3. SameValue, 即 Object.is()[无]
  4. SameValueZero, 被许多内置算法运用

宽松相等

严格相等

  • 原始类型

    • 不含 NaN, 值相等即可
    • 含 NaN, 绝对不等
    • +0 -0 0 相等
  • 对象,引用比较

  • indexOf,lastIndexOf 使用的是严格相等

Object.is()

  • +00相等
  • -00,+0都不相等 (区别于严格相等,SameValueZero)
  • NaNNaN 相等 (区别于严格相等)

SameValueZero

  • NaNNaN 相等 (区别于严格相等)
  • +0 -0 0 相等 (区别于Object.is)

数组相等

引用相等,用 ===

值相等

  1. _.isEqual in Lodash 数据类型?顺序?重复元素?

  2. 自定义 for循环比对, 比较方法使用=== Object.is

function arraysEqual(arr1, arr2) {
  // 1.首先判断数组的长度是否相等
  if (arr1.length !== arr2.length) {
    return false;
  }

  //2. 如果不考虑顺序的话,先排序
  //3. 如果不考虑重复,先去重
  // 遍历每一个元素进行比较
  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) {
      return false;
    }
  }

  return true;
}

// 示例用法
const array1 = [1, 2, 3];
const array2 = [1, 2, 3];
const array3 = [1, 2, 4];

console.log(arraysEqual(array1, array2)); // true
console.log(arraysEqual(array1, array3)); // false

对象相等