小于等于运算符:使用 NaN

The Less-than-or-equal Operator: With NaN

当我们使用小于等于运算符时,这是抽象关系比较算法的幕后工作。 例如。

a <= b;

像这样转换为 JavaScript

!(b < a)

并且 EcmaScript 规范说 (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5) 表示至少有一个操作数是 NaN 小于 return undefined 这意味着

var a = 1;
var b = "asd"
a < b // b.toNumber() => NaN and this is operation return undefined (false)

如果我们这样使用

var a = 1;
var b = "asd"
a <= b // this convert to  !(b < a) and (b<a) return undefined
// and !(undefined) must be true

但是 EcmaScript 规范说这是 return 错误的。这对我来说很有趣,这是什么原因?

虽然 <= 使用抽象关系比较算法,但 a <= b 不等同于 !(b < a)。它等效于 b < a !== false ? false : true(其中 < 表示抽象关系比较算法,而不是 JavaScript < 运算符,它永远不会计算为 undefined),其行为当 b < a 为真或恰好 false 时与 !(b < a) 相同,但通常当 b < a 为假时表现不同。如果 b < a 计算为 undefined,整个表达式将计算为 false

这在此处第 6 步的规范中定义:https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.3

  1. Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false.
  2. If r is true or undefined, return false. Otherwise, return true.

抽象关系比较算法只能计算为truefalseundefined;所以步骤 6 中的 "Otherwise" 只能在 rfalse 时应用,使 a <= b 等同于 b < a !== false ? false : true(同样,其中 < 表示抽象关系比较算法)。