JavaScript 关系比较运算符如何强制类型?

IT技术 javascript type-conversion
2021-02-07 12:34:14

当操作数是不同类型时,哪些规则适用于 JavaScript 关系比较运算符?

例如,如何true > null评价?我可以在我的开发者控制台中输入它并给出结果true,但为什么呢?

我搜索了一点,但没有找到任何解释这一点的博客文章,尽管有很多解释 == 和 === 比较运算符的类型强制。

1个回答

JavaScript 关系比较运算符类型强制在JavaScript 规范中定义,特别是在描述运算符的11.8 到 11.8.5以及描述强制操作数的过程的9.1 (ToPrimitive)9.3 (ToNumber) 节中。

简而言之,4 个比较运算符(<><=>=)尽最大努力将每个操作数转换为数字,然后比较这些数字。例外情况是当两个操作数都是字符串时,在这种情况下它们会按字母顺序进行比较。

具体来说,

  1. 如果参数o是对象而不是原始类型,请尝试通过调用将其转换为原始值o.valueOf()或 - 如果o.valueOf未定义或在调用时未返回原始类型 - 通过调用o.toString()

  2. 如果两个参数都是字符串,则根据它们的字典顺序进行比较例如,这意味着"a" < "b""a" < "aa"都返回真。

  3. 否则,将每个基元转换为 number,这意味着:

    • undefined -> NaN
    • Null -> +0
    • Boolean原始类型 -> 1if true, +0iffalse
    • String->尝试从字符串中解析一个数字
  4. 然后按照您对运算符的期望比较每个项目,但需要注意的是,任何涉及的比较都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