null 和 undefined 不一致的比较

Posted

技术标签:

【中文标题】null 和 undefined 不一致的比较【英文标题】:null and undefined inconsistent comparison 【发布时间】:2016-03-07 11:11:20 【问题描述】:

我很想知道为什么

null == undefined

返回 true 但是

null >= undefined

返回false

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

【问题讨论】:

undefined 是一个变量,它恰好是 undefined 只要你不定义它 我认为强制只适用于“==”。编辑:嗯,有趣,false >= null 实际上返回 true。所以现在我也很好奇;) Is the inclusion of the greater than operator coercing the values differently? 包含> 意味着值不会被强制。 抱歉,这里的“强制”是什么意思? 如果 >= 不强制,为什么 false >= null 返回 true? 【参考方案1】:

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

【讨论】:

并不是真正询问 == 和 == 之间的区别,而是询问 == 和 >= 之间的区别【参考方案2】:

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


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

>= 运算符的algorithm 使用"Abstract Relational Comparison Algorithm",它由其他关系运算符共享。从规范中的描述中,我们看到该算法做了以下事情:

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

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


对于另一种情况,==,故事实际上要简单得多:spec explicitly states 和 null == undefined 作为“抽象平等比较算法”的一部分是正确的(参见步骤 2. 和 3.)。因此,null == undefinedtrue

【讨论】:

很好的解释。所以这也解释了为什么 false >= null 会导致“true”,然后两个值都会被强制为“0”,对吗? @docta_faustus:没错。 @frontend_dev:是的,falsenull 都被强制转换为 +0 The Abstract Relational Comparison Algorithm 哇塞满了。不过学到了一些东西,太好了。 alert(+null) // 0 alert(+undefined) // NaN

以上是关于null 和 undefined 不一致的比较的主要内容,如果未能解决你的问题,请参考以下文章

null,undefined,undeclared的区别

null和undefined相等比较

undefined和null区别

null undefined false 值转换的比较

在 null 和 undefined 比较的情况下内部会发生啥?

js 自动类型转换