【问题标题】:How do the JavaScript relational comparison operators coerce types?JavaScript 关系比较运算符如何强制类型?
【发布时间】:2013-01-19 05:16:15
【问题描述】:

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

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

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

【问题讨论】:

  • 亲爱的投票者,请注意 StackOverflow explicitly encourages asking and answering your own questions,所以我希望能得到一些反馈,解释为什么我的问题收到了反对票,而我的答案却收到了赞成票 :-)
  • 你的回答很好。你的问题……没那么多。请记住,确实鼓励自己回答问题,但要正确回答问题部分很难。如果您的问题质量不高且没有标记为社区 wiki,那么它很可能会被否决甚至关闭。请参阅meta.stackexchange.com/questions/163623/…,了解您可以采取哪些措施来遏制这种情况。
  • 我不会投反对票,但是,我想看看您对此的回答:您如何提出这样的问题,不到 1 分钟后您给出了详细而完整的答案?你真的有疑问吗?
  • 我不是反对者之一,但我认为这个问题太笼统了。编辑后稍微好一点,现在可以阅读为对null > true 案例的解释请求。这更像是 Stack Overflow 式的。
  • @Ark,这并不重要,您可以发布您已经知道答案的问题。然而,问题的质量在这里至关重要。

标签: javascript type-conversion


【解决方案1】:

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 -> NaN
    • Null -> +0
    • Boolean 原始类型 -> 1 if true, +0 if 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多