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 == undefined
是true
。
事实上,这些值在这两种情况下都会被强制转换(至少从某种意义上说,==
的情况很特殊)。让我们在规范的帮助下一次一个地考虑它们。
>=
运算符的algorithm 使用"Abstract Relational Comparison Algorithm",它由其他关系运算符共享。从规范中的描述中,我们看到该算法做了以下事情:
-
将参数转换为原语(
null
和 undefined
已经是)。
检查参数是否为String
s(它们不是)。
如果不是String
s,算法将参数转换为数字(参见步骤 3.a. 和 3.b.),并与结果进行比较。
最后一点是关键。从ToNumber
table 中,我们看到undefined
被强制转换为NaN
,并且该算法认为与NaN
的任何比较都是虚假的(参见步骤3.c. 和3.d.)。因此,null >= undefined
是 false
。
对于另一种情况,==
,故事实际上要简单得多:spec explicitly states 和 null == undefined
作为“抽象平等比较算法”的一部分是正确的(参见步骤 2. 和 3.)。因此,null == undefined
是 true
。
【讨论】:
很好的解释。所以这也解释了为什么 false >= null 会导致“true”,然后两个值都会被强制为“0”,对吗? @docta_faustus:没错。 @frontend_dev:是的,false
和 null
都被强制转换为 +0
。
The Abstract Relational Comparison Algorithm
哇塞满了。不过学到了一些东西,太好了。
alert(+null) // 0 alert(+undefined) // NaN以上是关于null 和 undefined 不一致的比较的主要内容,如果未能解决你的问题,请参考以下文章