null 和 undefined 不一致比较
null and undefined inconsistent comparison
我很好奇为什么
null == undefined
returns true
但
null >= undefined
returns false
是否包含大于运算符以不同方式强制值?
在 JS 中,==
运算符将值强制转换为相同类型进行比较,因此 1=="1"
是 true
。使用 ===
运算符进行精确类型匹配
tl;dr 在这种情况下,>=
最终将两个参数都强制转换为数字:undefined
被强制转换为 NaN
而 null
被强制转换为 0
,这是不相等的。对于 ==
,规范明确定义 null == undefined
是 true
。
事实上,这些值在这两种情况下都会被强制转换(至少在某种意义上 - ==
的情况很特殊)。让我们在规范的帮助下一次考虑它们。
algorithm for the >=
operator uses the "Abstract Relational Comparison Algorithm",其他关系运算符共享。从规范中的描述,我们看到该算法执行以下操作:
- 将参数转换为基元(
null
和 undefined
已经是)。
- 检查参数是否为
String
(它们不是)。
- 如果它们不是
String
,算法 将参数转换为数字(参见步骤 3.a。和 3.b。)并与结果进行比较。
最后一点是关键。从 ToNumber
table,我们看到 undefined
被强制转换为 NaN
,算法认为与 NaN
的任何比较都是错误的(参见步骤 3.c 和3.d.)。因此,null >= undefined
是 false
.
对于另一种情况,==
,故事实际上要简单得多:作为 "Abstract Equality Comparison Algorithm" 的一部分,spec explicitly states null == undefined
为真(参见步骤 2 . 和 3.).因此,null == undefined
是 true
.
我很好奇为什么
null == undefined
returns true
但
null >= undefined
returns false
是否包含大于运算符以不同方式强制值?
在 JS 中,==
运算符将值强制转换为相同类型进行比较,因此 1=="1"
是 true
。使用 ===
运算符进行精确类型匹配
tl;dr 在这种情况下,>=
最终将两个参数都强制转换为数字:undefined
被强制转换为 NaN
而 null
被强制转换为 0
,这是不相等的。对于 ==
,规范明确定义 null == undefined
是 true
。
事实上,这些值在这两种情况下都会被强制转换(至少在某种意义上 - ==
的情况很特殊)。让我们在规范的帮助下一次考虑它们。
algorithm for the >=
operator uses the "Abstract Relational Comparison Algorithm",其他关系运算符共享。从规范中的描述,我们看到该算法执行以下操作:
- 将参数转换为基元(
null
和undefined
已经是)。 - 检查参数是否为
String
(它们不是)。 - 如果它们不是
String
,算法 将参数转换为数字(参见步骤 3.a。和 3.b。)并与结果进行比较。
最后一点是关键。从 ToNumber
table,我们看到 undefined
被强制转换为 NaN
,算法认为与 NaN
的任何比较都是错误的(参见步骤 3.c 和3.d.)。因此,null >= undefined
是 false
.
对于另一种情况,==
,故事实际上要简单得多:作为 "Abstract Equality Comparison Algorithm" 的一部分,spec explicitly states null == undefined
为真(参见步骤 2 . 和 3.).因此,null == undefined
是 true
.