为什么 Javascript 在 Infinity/NaN 比较中不遵循 ECMA 规范?

Why does Javascript not follow ECMA specs on Infinity/NaN comparisons?

我已经在 Chrome、Firefox、Safari 中测试过。他们在这些比较中都给出了相同的结果。

而根据Abstract Relational Comparison algorithm,在4h和4i步骤中,上述表达式应该return undefined, true, true.

我在这里错过了什么?

lval < rval,计算时,does

  1. Let r be the result of performing Abstract Relational Comparison lval < rval.
  2. ReturnIfAbrupt(r).
  3. If r is undefined, return false. Otherwise, return r.

虽然“抽象关系比较”(ARC)可能returnundefined,但<运算符求值的最终结果总是truefalse.

数字与其他数字的实际比较见6.1.6.1.12 Number::lessThan ( x, y );看看 ARC 是怎么说的:

f. If Type(nx) is the same as Type(ny), return Type(nx)::lessThan(nx, ny).

因此,ARC 中步骤 F 之后的内容与您正在检查的这些表达式无关,因为在每个表达式中,您都在将一个数字与另一个数字进行比较。


0 < NaN 完成 lessThan 的第 2 步:

If y is NaN, return undefined.

导致 ARC returning undefined,导致最终值 false如果 r 未定义,return 为假。.

Infinity < Infinity首先完成第6步,即:

If x is +∞, return false.

-Infinity < -Infinity首先完成第8步,即:

If y is -∞, return false.