当操作数属于不同类型时,哪些规则适用于 JavaScript 关系比较运算符?
例如,如何true > null
评估?我可以在我的开发者控制台中输入它并给出结果true
,但是为什么呢?
我搜索了一下,但没有找到任何解释这一点的博客文章,尽管有很多解释 == 和 === 比较运算符的类型强制。
当操作数属于不同类型时,哪些规则适用于 JavaScript 关系比较运算符?
例如,如何true > null
评估?我可以在我的开发者控制台中输入它并给出结果true
,但是为什么呢?
我搜索了一下,但没有找到任何解释这一点的博客文章,尽管有很多解释 == 和 === 比较运算符的类型强制。
JavaScript 关系比较运算符类型强制在JavaScript 规范中定义,特别是在描述运算符的第11.8 到 11.8.5节以及描述强制操作数的过程的第9.1 节(ToPrimitive)和第9.3 节(ToNumber)中。
简而言之,4 个比较运算符(<
、>
、<=
和>=
)尽最大努力将每个操作数转换为一个数字,然后比较这些数字。例外情况是两个操作数都是字符串时,在这种情况下它们按字母顺序进行比较。
具体来说,
如果参数o
是对象而不是原始类型,请尝试通过调用o.valueOf()
或 - 如果o.valueOf
未定义或调用时未返回原始类型 - 通过调用将其转换为原始值o.toString()
如果两个参数都是字符串,则根据它们的字典顺序比较它们。例如,这意味着"a" < "b"
and"a" < "aa"
都返回 true。
否则,将每个基元转换为一个数字,这意味着:
undefined
->NaN
Null
-> +0Boolean
原始类型 -> 1
if true
, +0
iffalse
String
->尝试从字符串中解析一个数字然后按照您对运算符的期望比较每个项目,并注意任何涉及的比较NaN
计算结果为false
.
因此,这意味着以下内容:
console.log(true > null); //prints true
console.log(true > false); //prints true
console.log("1000.0" > 999); //prints true
console.log(" 1000\t\n" < 1001); //prints true
var oVal1 = { valueOf: function() { return 1; } };
var oVal0 = { toString: function() { return "0"; } };
console.log(oVal1 > null); //prints true
console.log(oVal0 < true); //prints true
console.log(oVal0 < oVal1); //prints true