为什么 undefined == undefined 是 true 而不是 undefined <= undefined?

Why is undefined == undefined true but not undefined <= undefined?

在 JavaScript 中,这是正确的:

undefined == undefined

但这是错误的:

undefined <= undefined

起初我以为 <= 运算符包含第一个,但我猜它试图将其转换为数字但失败了,但我没有找到任何文档来支持这一点.

<= 运算符 coerces both operands into actual Numbers before performing the comparison if both operands are primitives -- while == does not.1 Abstract relational comparison is performed which is where this conversion actually happens. The operation ToNumberundefined 执行,产生 NaN(请参阅 linked table)。如果您随后查看抽象关系比较的步骤 4c 和 4d,如果 <= 的任一操作数被强制转换为 NaN,则从抽象关系比较返回 undefined。回到第一个 link,您将在第 7 步中看到:

If r is true or undefined, return false. Otherwise, return true.

由于抽象关系比较返回 undefined<= 的计算结果为 false。

不太正式,你可以这样看你的比较:

const first = Number(undefined); //or +undefined
const two = Number(undefined); //this is NaN
NaN <= NaN

因为 NaN == NaN is never true, nor is NaN < NaNNaN <= NaN 是错误的。


1 undefined == undefined returns true 基于抽象 SameValueNonNumber 操作,如果两个操作数是相同的值,则与相等运算符一起使用,但不是数字。

阅读 JavaScript 中的 强制。关于您的问题,当您应用相等运算符时,您的未定义被强制转换为布尔值。所以你得到了一个真实的结果。当您应用“<=”运算符时,您的 undefined 被强制转换为一个 Number 并且您得到一个 NaN 值,这就是错误结果的原因。