null 和 undefined 不一致比较

null and undefined inconsistent comparison

我很好奇为什么

null == undefined

returns true

null >= undefined

returns false

是否包含大于运算符以不同方式强制值?

在 JS 中,== 运算符将值强制转换为相同类型进行比较,因此 1=="1"true。使用 === 运算符进行精确类型匹配

tl;dr 在这种情况下,>= 最终将两个参数都强制转换为数字:undefined 被强制转换为 NaNnull 被强制转换为 0,这是不相等的。对于 ==,规范明确定义 null == undefinedtrue


事实上,这些值在这两种情况下都会被强制转换(至少在某种意义上 - == 的情况很特殊)。让我们在规范的帮助下一次考虑它们。

algorithm for the >= operator uses the "Abstract Relational Comparison Algorithm",其他关系运算符共享。从规范中的描述,我们看到该算法执行以下操作:

  1. 将参数转换为基元(nullundefined 已经是)。
  2. 检查参数是否为 String(它们不是)。
  3. 如果它们不是 String,算法 将参数转换为数字(参见步骤 3.a。和 3.b。)并与结果进行比较。

最后一点是关键。从 ToNumber table,我们看到 undefined 被强制转换为 NaN,算法认为与 NaN 的任何比较都是错误的(参见步骤 3.c 和3.d.)。因此,null >= undefinedfalse.


对于另一种情况,==,故事实际上要简单得多:作为 "Abstract Equality Comparison Algorithm" 的一部分,spec explicitly states null == undefined 为真(参见步骤 2 . 和 3.).因此,null == undefinedtrue.