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

How do the JavaScript relational comparison operators coerce types?

本文关键字:何强制 类型 运算符 关系 比较 JavaScript      更新时间:2023-09-26

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

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

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

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

简而言之,4个比较运算符(<><=>=)尽其所能将每个操作数转换为一个数字,然后比较这些数字。例外情况是,当两个操作数都是字符串时,会按字母顺序进行比较。

具体而言,

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

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

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

    • undefined->NaN
    • Null->+0
    • Boolean基元类型->如果true则为1,如果false则为+0
    • 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