当我们使用小于或等于运算符时,这可以在抽象关系比较算法的支持下进行。 例如。
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。这对我来说很有趣,这是什么原因?
答案 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
- 让 r 是执行抽象关系比较的结果 rval < lval ,其中 LeftFirst 等于 false 。
- 如果 r 为 true 或未定义,则返回 false 。否则,返回 true 。
抽象关系比较算法只能计算为false
,true
或false
;因此第6步中的“否则”仅在undefined
为r
时适用,从而使false
等效于a <= b
(同样,其中b < a !== false ? false : true
代表抽象关系比较算法)。