当操作数属于不同类型时,JavaScript关系比较运算符适用哪些规则?
例如,如何评估true > null
?我可以在我的开发者控制台中输入它,它会得到结果true
,但为什么?
我搜索了一下,但没有发现任何博客文章解释这个,虽然有很多解释类型强制==和===比较运算符。
答案 0 :(得分:20)
JavaScript关系比较运算符类型强制定义在JavaScript specification中,特别是在描述运算符的11.8 to 11.8.5部分中,以及描述过程的9.1 (ToPrimitive)和9.3 (ToNumber)部分强迫操场。
简而言之,4个比较运算符(<
,>
,<=
和>=
)尽力将每个操作数转换为数字,然后比较数字。例外情况是两个操作数都是字符串,在这种情况下,它们按字母顺序进行比较。
具体地,
如果参数o
是对象而不是原语,try to convert it to a primitive value可以通过调用o.valueOf()
或 - 如果o.valueOf
未定义或未定义调用时返回基本类型 - 通过调用o.toString()
如果两个参数都是字符串,请根据它们的lexicographical ordering进行比较。例如,这意味着"a" < "b"
和"a" < "aa"
都返回true。
否则,convert each primitive to a number,表示:
undefined
- &gt; NaN
Null
- &gt; 0 Boolean
原始类型 - &gt; 1
true
,+0
false
String
- &gt;来自字符串然后按照您对操作员的期望比较每个项目,并注意任何涉及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