为什么undefined == undefined为true但未定义<= undefined?

pab*_*unk 3 javascript operators coercion

在JavaScript中这是真的:

undefined == undefined
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

undefined <= undefined
Run Code Online (Sandbox Code Playgroud)

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

Li3*_*357 6

<=运营商强制将两个操作数为实际数字进行比较之前,如果两个操作数是原语 -而==确实不是.1 执行抽象关系比较,这是实际发生转换的地方.操作ToNumber进行上undefined这的产率NaN(参见链接表).如果你再看看步骤4C和4D从抽象关系比较,如果其中一个操作数<=被强制转换NaN,然后undefined是从抽象关系比较返回.回到第一个链接,您将在步骤7中看到:

如果rtrue未定义,则返回false.否则,返回true.

由于返回了抽象关系比较undefined,因此<=求值为false.

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

const first = Number(undefined); //or +undefined
const two = Number(undefined); //this is NaN
NaN <= NaN
Run Code Online (Sandbox Code Playgroud)

既然NaN == NaN是不正确的,也不是NaN < NaN,NaN <= NaN是假的.


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