You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。
  • 你的两点推测完全正确。

执行逻辑推导

我们一步步对应代码的判断分支:

  1. 第一个判断if (value === other) return true:如果两个NaN传入,NaN === NaN返回false,所以不会走这个分支。
  2. 第二个判断的触发条件:value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))
    两个NaN都是数字原始类型,满足!isObjectLike(value) && !isObjectLike(other),所以会进入这个分支。
  3. 进入分支后执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:18:03