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

时间:2013-02-04 13:33:37

标签: javascript type-conversion

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

例如,如何评估true > null?我可以在我的开发者控制台中输入它,它会得到结果true,但为什么?

我搜索了一下,但没有发现任何博客文章解释这个,虽然有很多解释类型强制==和===比较运算符。

1 个答案:

答案 0 :(得分:20)

JavaScript关系比较运算符类型强制定义在JavaScript specification中,特别是在描述运算符的11.8 to 11.8.5部分中,以及描述过程的9.1 (ToPrimitive)9.3 (ToNumber)部分强迫操场。

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

具体地,

  1. 如果参数o是对象而不是原语,try to convert it to a primitive value可以通过调用o.valueOf()或 - 如果o.valueOf未定义或未定义调用时返回基本类型 - 通过调用o.toString()

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

  3. 否则,convert each primitive to a number,表示:

    • undefined - &gt; NaN
    • Null - &gt; 0
    • Boolean原始类型 - &gt; 1 true+0 false
    • String - &gt;来自字符串
    • try to parse a number
  4. 然后按照您对操作员的期望比较每个项目,并注意任何涉及NaN的比较都评估为false

  5. 所以,这意味着以下内容:

    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