为什么Javascript不遵循ECMA关于Infinity / NaN比较的规范?

问题描述

我已经在Chrome,Firefox,Safari中进行了测试。这些比较结果都相同。

  • 0 < NaN返回false
  • Infinity < Infinity返回false
  • -Infinity < -Infinity返回false

根据Abstract Relational Comparison algorithm,在4h和4i步骤中,以上表达式应返回undefinedtruetrue

在这里想念什么?

enter image description here

解决方法

lval < rval,在评估时,does

  1. 让它成为执行抽象关系比较lval
  2. ReturnIfAbrupt(r)。
  3. 如果r未定义,则返回false。否则,返回r。

尽管“抽象关系比较”(ARC)可能返回undefined,但对<运算符求值的最终结果始终是truefalse

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

f。如果Type(nx)与Type(ny)相同,则返回Type(nx)::lessThan(nx,ny).

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


0 < NaN完成了lessThan的第2步:

如果y为NaN,则返回undefined。

导致ARC返回undefined,最终值为false如果r未定义,则返回false。

Infinity < Infinity首先执行步骤6,即:

如果x为+∞,则返回false。

-Infinity < -Infinity首先执行步骤8,即:

如果y为-∞,则返回false。