小于等于运算符:使用NaN

时间:2019-07-29 19:11:23

标签: javascript type-conversion ecmascript-5 type-coercion

当我们使用小于或等于运算符时,这可以在抽象关系比较算法的支持下进行。 例如。

a <= b;

像这样转换为JavaScript

!(b < a)

EcmaScript Spesification说(http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5)表示至少一个操作数比返回undefined少NaN 这就是

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 spesification表示这返回false。这对我来说很有趣,这是什么原因?

1 个答案:

答案 0 :(得分:2)

虽然<=确实使用了抽象关系比较算法,但是a <= b不等于!(b < a)。它等效于b < a !== false ? false : true(其中<代表抽象关系比较算法,而不是JavaScript <运算符,永远不能求和为undefined),其行为与{当!(b < a)为真或完全为b < a时,{1}},但一般而言,当false为假时,其行为不同。如果b < a的值为b < a,则整个表达式的值为undefined

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

  
      
  1. r 是执行抽象关系比较的结果    rval < lval ,其中 LeftFirst 等于 false
  2.   
  3. 如果 r true 未定义,则返回 false 。否则,返回 true
  4.   

抽象关系比较算法只能计算为falsetruefalse;因此第6步中的“否则”仅在undefinedr时适用,从而使false等效于a <= b(同样,其中b < a !== false ? false : true代表抽象关系比较算法)。