相等算法
JavaScript 提供三种不同的值比较运算:
===
——严格相等(三个等号)==
——宽松相等(两个等号)Object.is()
宽松相等 ==
- 在比较两个操作数时,双等号(==)将执行类型转换
- 对 NaN、-0 和 +0 进行特殊处理(故 NaN != NaN,且 -0 == +0)
- 对应JS相等算法中的
IsLooselyEqual
行为如下:
- 操作数类型相同:
- 对象Object时:比较两个对象的内存地址
- 数字Number时:比较两个数字的值, NaN != NaN,且 -0 == +0
- 字符串String、布尔Boolean、大整形BigInt、Symbol时:比较两个的值
- 如果其中一个操作数为
null
或undefined
, 只有另一个也必须是null
或undefined
才为true
- 如果其中一个操作数是对象,另一个是原始值,则将对象转换为原始值
- 这是两个操作时都为原始值(String、Number、Boolean、BigInt、Symbol)
- 如果类型相等,则根据规则1进行比较
- 符号只会与同一符号相等
- 如果一个是boolean,另一个不是,则将布尔值转换为数字 1 或 0
- 数字与字符串:字符串转换为数字。转换失败的结果为 NaN,这将保证相等比较为 false
- 数字与大整型:按数字的值进行比较。如果数字为±Infinity或NaN,返回 false
- 字符串与大整型:使用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);
}
面试题
==和===有什么区别