Skip to content

相等算法

JavaScript 提供三种不同的值比较运算:

  • ===——严格相等(三个等号)
  • ==——宽松相等(两个等号)
  • Object.is()

宽松相等 ==

  • 在比较两个操作数时,双等号(==)将执行类型转换
  • 对 NaN、-0 和 +0 进行特殊处理(故 NaN != NaN,且 -0 == +0)
  • 对应JS相等算法中的IsLooselyEqual

行为如下:

  1. 操作数类型相同:
    1. 对象Object时:比较两个对象的内存地址
    2. 数字Number时:比较两个数字的值, NaN != NaN,且 -0 == +0
    3. 字符串String、布尔Boolean、大整形BigInt、Symbol时:比较两个的值
  2. 如果其中一个操作数为nullundefined, 只有另一个也必须是nullundefined才为true
  3. 如果其中一个操作数是对象,另一个是原始值,则将对象转换为原始值
  4. 这是两个操作时都为原始值(String、Number、Boolean、BigInt、Symbol)
    1. 如果类型相等,则根据规则1进行比较
    2. 符号只会与同一符号相等
    3. 如果一个是boolean,另一个不是,则将布尔值转换为数字 1 或 0
    4. 数字与字符串:字符串转换为数字。转换失败的结果为 NaN,这将保证相等比较为 false
    5. 数字与大整型:按数字的值进行比较。如果数字为±Infinity或NaN,返回 false
    6. 字符串与大整型:使用BigInt将字符串转换为大整型数。如果转换失败,返回 false

严格相等 ===

  • 比较时不进行类型转换;如果类型不同,则返回 false
  • NaN != NaN,且 -0 == +0
  • 对应JS相等算法中的IsStrictlyEqual

数组索引查找方法使用严格相等, 包括 Array.prototype.indexOf()、Array.prototype.lastIndexOf()、TypedArray.prototype.index()、TypedArray.prototype.lastIndexOf() 和 case 匹配

同值相等 Object.is()

  • 不进行类型转换
  • NaN 等于 NaN
  • +0 不等于 -0
  • 对应JS相等算法中的SameValue

零值相等

  • 与同值相等的区别在于其将 -0 和 0 视作相等
  • 与严格相等的区别在于其将 NaN 视作是相等的
  • 这使得它在搜索期间通常具有最实用的行为, 被用于 Array.prototype.includes()、TypedArray.prototype.includes(),以及 Map 和 Set 的需要比较键的相等性的方法
js
function sameValueZero(x, y) {
  if (x === 0 && y === 0) {
    return true;
  }
  return Object.is(x, y);
}

面试题

==和===有什么区别

苏ICP备2025160170号-1 | 前端进化之路 | Released under the MIT License.