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

标签 javascript type-conversion

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

例如,true > null 是如何求值的?我可以将其输入到我的开发人员控制台,它会给出结果 true,但为什么呢?

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

最佳答案

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

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

具体而言,

  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 -> NaN
    • Null -> +0
    • Boolean原始类型 -> 1如果true , +0如果false
    • String -> try to parse a number来自字符串
  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

关于javascript - JavaScript 关系比较运算符如何强制类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14687876/

相关文章:

c# - 将 double 强制转换为 long 更改值

c++ - 模板类实例之间的类型转换

javascript - 如何在 HTML 中搜索表格中的数据

javascript - jQuery 选择器 : select a box but not an element inside the box

javascript - 在 nodejs 公用文件夹中公开 nodejs 库

Javascript 作用域

javascript - typeof a 的解释是什么,其中 var a = 2 + [] 是字符串?

你能解释一下这个—"the rules involving mixed types of operands do not apply to the shift operators"

java类型转换问题

javascript - 在 v-for 列表项中显示和隐藏 div (Vue.js 2)