Lodash的isEqual中value !== value在什么场景下返回true?
结论
该语句仅当value和other都是NaN时会返回true,这是Lodash为了兼容NaN的特殊相等规则做的专门处理。
前置知识铺垫
- JS 中唯一满足
x !== x的取值只有NaN,这是 IEEE 754 浮点数标准的规定,NaN和任何值(包括自身)严格相等比较都返回false。 - Lodash 的
isObjectLike实现逻辑为:判断值不为null且typeof返回值为'object',所以所有原始类型(数字、字符串、布尔值、undefined、Symbol、BigInt)、函数类型都会被isObjectLike判定为false。 - 你的两点推测完全正确。
执行逻辑推导
我们一步步对应代码的判断分支:
- 第一个判断
if (value === other) return true:如果两个NaN传入,NaN === NaN返回false,所以不会走这个分支。 - 第二个判断的触发条件:
value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))
两个NaN都是数字原始类型,满足!isObjectLike(value) && !isObjectLike(other),所以会进入这个分支。 - 进入分支后执行
return value !== value && other !== other:两个NaN都满足x !== x,所以逻辑与的结果为true,正好符合_.isEqual(NaN, NaN) = true的预期行为。
其他场景的验证
你提到的其他可能取值都不会触发该语句返回true:
- 如果值是
null/undefined:null === null、undefined === undefined都会被第一个分支捕获返回true;如果是null和undefined比较,value == null || other == null触发第二个分支,但null !== null为false,所以最终返回false,符合_.isEqual(null, undefined) = false的规则。 - 如果是其他原始类型(非
NaN的数字、字符串、布尔值等):要么会被第一个===判断捕获返回true,要么不相等的情况下无法同时满足x !== x,所以返回false。 - 函数类型:两个不相等的函数会走到
baseIsEqualDeep分支做深比较,不会触发这个返回逻辑。
内容的提问来源于stack exchange,提问作者gkl
相关产品推荐
相关产品推荐

