10

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

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

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

4

1 回答 1

23

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"and"a" < "aa"都返回 true。

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

    • 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
于 2013-02-04T13:33:36.573 回答