null和未定义的不一致比较

null and undefined inconsistent comparison

本文关键字:不一致 比较 未定义 null      更新时间:2023-09-26

我很想知道的原因

null == undefined

返回true,但返回

null >= undefined

返回false

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

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


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

>=运算符的算法使用了其他关系运算符共享的"抽象关系比较算法"。从规范中的描述中,我们可以看到该算法执行以下操作:

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

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


对于另一种情况==,情况实际上要简单得多:规范明确指出null == undefined是真的,这是"抽象等式比较算法"的一部分(参见步骤2。因此,null == undefined就是true

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