javascript - null 和 undefined 不一致比较

标签 javascript operators equality-operator

我很想知道为什么

null == undefined

返回 true 但是

null >= undefined

返回 false

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

最佳答案

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


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

algorithm >= 运算符使用 "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


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

关于javascript - null 和 undefined 不一致比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055818/

相关文章:

.net - 在 F# 中重载 "="和 "<>"

javascript - Kendo UI Datepicker 禁用输入

regex - F# 正则表达式匹配链

python - 'for' 循环中的 i = i + 1 和 i += 1 有什么区别?

c - 将 void 指针与 C 中的类型化指针进行比较(为了相等)是 UB 吗?

c++ - 无法从类型 'Class::operator==' bool 转换为 'bool (Class::)(Class*) to type '

javascript - Div.scrollTop 过早滚动

javascript - 如何在 Worker 中导入/使用 Immutable.js

javascript - Reactjs 路由器 - 无法删除网址上丑陋的查询字符串

c++ - 我是否必须实现所有 4 个运算符重载才能处理所有 const 和非常量组合?