当操作数是不同类型时,哪些规则适用于 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"和"a" < "aa"都返回真。
否则,将每个基元转换为 number,这意味着:
然后按照您对运算符的期望比较每个项目,但需要注意的是,任何涉及的比较都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