小于等于运算符:使用 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
- Let r be the result of performing abstract relational comparison
rval < lval with LeftFirst equal to false.
- If r is true or undefined, return false. Otherwise, return true.
抽象关系比较算法只能计算为true
、false
或undefined
;所以步骤 6 中的 "Otherwise" 只能在 r
为 false
时应用,使 a <= b
等同于 b < a !== false ? false : true
(同样,其中 <
表示抽象关系比较算法)。
当我们使用小于等于运算符时,这是抽象关系比较算法的幕后工作。 例如。
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
- Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false.
- If r is true or undefined, return false. Otherwise, return true.
抽象关系比较算法只能计算为true
、false
或undefined
;所以步骤 6 中的 "Otherwise" 只能在 r
为 false
时应用,使 a <= b
等同于 b < a !== false ? false : true
(同样,其中 <
表示抽象关系比较算法)。